题意
当$n=0$时有如下图像
当$n=1$时有如下图像
当$n=2$时有如下图像
题目要求对定的$n$的图像,染k个三角形(并不要求染最小的三角形),求染色方案数.
需要注意的是:即使染色完毕后结果图案相同,若某一步染的三角形不相同也算是不同的两种方案.
分析
可以发现染色是可以分层次的.
我们把$n$的图像分为$n$层,最内层为$0$,则可以一层一层向外染色.
如果想对小三角形染色,是与上一层及以内是否染过色无关的.
如果想对大三角形染色,我们只需要判断上一层及以内的一个染色方案中,某一象限内是否染过色即可.
我们画出图来分析
我们发现在划分为$n$层后层与层之间分为两层更加合适.
上图中从第$i$层到第$i+0.5$层的转移很简单,并不需要判断前$i$层之内某一象限是否被染过色(只有①,②,③,④可选)
重点是第$i+0.5$层到第$i+1$层
在这一层中我们可以选择
- 像⑥,⑦,⑧这样的小三角形
- 像⑤⑥,⑦⑧这样两个三角形拼接起来的中等大小的三角形
- 像第一象限和第二象限拼在一起的
超级大三角形
于是按照这个思路我们可以求得层与层之间的转移
在从$i=0$开始循环一边,用已经求得的转移来转移,就可以求到大小为$n$的图,染$k$个三角形的方案数.
那么,题目说若某一步染的三角形不相同也算是不同
,其实答案乘以$k!$就好了么.
好吧说这么多实现起来还是照样复杂…几乎都是抄的代码了 23333333
stO zhonghaoxi
代码
1 | #include <cstdio> |