题目链接:http://bailian.openjudge.cn/practice/2663/
现在我们通过计算机编程对 3 乘 n 棋盘的不同的完美覆盖的总数进行计算。
任务
对 3 乘 n 棋盘的不同的完美覆盖的总数进行计算。
n 的值最大不超过 30.
2 8 12 -1
3 153 2131
此题很明显看出是在考察递推关系,而递推关系的关键点就在衔接之处,一个小单位是三块方块总共有3种方法这比较容易看出,那递推式就是f(n)=f(n-2)*3+。。。(n-2是因为奇数无法完美覆盖)那到底加什么呢,这就看衔接部分的问题了,衔接处两个单位放在一起时只有两个竖着的方块可以变成两个相叠的方块(有两种情况,上一种下一种这个在纸上画画就出来了)。所以下面一个参数也出来了f(n)=3*f(n-2)+2*f(n-4), 如果觉得这样就完事那就错了,我就是一开始没注意到这一点漏掉了后面很多项检查了蛮久的。刚才我们的递推式只是以最小单位(3块)来推的,然而还有小单位组成的大单位(6、9、12.块等)处也有衔接,加上这些项 f(n)=3*f(n-2)+2*f(n-4)+...2*f(0),此处f(0)要设成1,不然AC不了(这应该是给的答案的问题),进一步化简可以得f(n)=4*f(n-2)-f(n-4)。 搞清楚这些下面就只要写程序了。
#include <stdio.h>
#include <math.h>
int F[16]={0};
int n;
int main(){
while(scanf("%d",&n)!=EOF){
if(n==-1)
break;
F[0]=1;
F[1]=3;
F[2]=11;
for(int i=3;i<16;i++){
F[i]=4*F[i-1]-F[i-2];
}
printf("%d\n", (n%2)==0? F[n/2]:0);
}
return 0;
}