poj 2663 递推问题

题目链接:http://bailian.openjudge.cn/practice/2663/


描述
一张普通的国际象棋棋盘,它被分成 8 乘 8 (8 行 8 列) 的 64 个方格。设有形状一样的多米诺牌,每张牌恰好覆盖棋盘上相邻的两个方格,即一张多米诺牌是一张 1 行 2 列或者 2 行 1 列的牌。那么,是否能够把 32 张多米诺牌摆放到棋盘上,使得任何两张多米诺牌均不重叠,每张多米诺牌覆盖两个方格,并且棋盘上所有的方格都被覆盖住?我们把这样一种排列称为棋盘被多米诺牌完美覆盖。这是一个简单的排列问题,同学们能够很快构造出许多不同的完美覆盖。但是,计算不同的完美覆盖的总数就不是一件容易的事情了。不过,同学们 发挥自己的聪明才智,还是有可能做到的。
现在我们通过计算机编程对 3 乘 n 棋盘的不同的完美覆盖的总数进行计算。



任务
对 3 乘 n 棋盘的不同的完美覆盖的总数进行计算。
输入
一次输入可能包含多行,每一行分别给出不同的 n 值 ( 即 3 乘 n 棋盘的列数 )。当输入 -1 的时候结束。

n 的值最大不超过 30.
输出
针对每一行的 n 值,输出 3 乘 n 棋盘的不同的完美覆盖的总数。
样例输入
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;
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值