原题: http://acm.hdu.edu.cn/showproblem.php?pid=2046
题目:
骨牌铺方格
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 36101 Accepted Submission(s): 17545
Problem Description
在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数.
例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图:
Input
输入数据由多行组成,每行包含一个整数n,表示该测试实例的长方形方格的规格是2×n (0< n<=50)。
Output
对于每个测试实例,请输出铺放方案的总数,每个实例的输出占一行。
Sample Input
1
3
2
Sample Output
1
3
2
思路:
这道题我们可以模拟。
显然,当长度为1的时候,只有1种方案,当长度为2的时候,有两种方案。
当长度为3的时候,如果所示:
当第三个竖着放进去的时候,右边有两种情况,这恰好是长度为2的所有情况。
当第三个横着放的时候,下面是固定了的,右边恰好是长度为1的情况。
当长度为4的时候我们同样可以得出,第四个竖着放右边是放三个的情况,第四个横着放就是放两个的情况,所以状态转移方程就出来了。
a[i]=a[i-1]+a[i-2];
每次的结果都是上两次结果的和。
代码:
#include <iostream>
#include"stdio.h"
using namespace std;
typedef long long int lint;
int main()
{
int n;
lint a[51];
a[1]=1;
a[2]=2;
for(int i=3;i<=50;i++)
{
a[i]=a[i-1]+a[i-2];
}
while(scanf("%d",&n)!=EOF)
{
printf("%lld\n",a[n]);
}
return 0;
}