题目
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
思路
一种思路是使用递推
,
假设dp[i]表示 2 x i 规格的长方形方格的放置方法总数,那么显然dp[1] = 1, dp[2] = 2。在 dp[1] 和 dp[2] 的基础上可以推出dp[3],因为dp[3]无非就是在dp[1]所包含的放置方式后面再加上两块横着放的骨牌,或者是在dp[2]所包含的情况后面加上一块竖着放的骨牌。
假设我们知道了dp[i - 1]和dp[i - 2],现在要求dp[i],
dp[i]可以理解成,
- 在dp[i - 1]表示的长方形方格后加上一块2 x 1的方格。对于这种情况,只能竖着放一块骨牌。
- 或是在dp[i - 2]表示的长方形方格后加上一块2 x 2的方格后加上一块2 x 2的方格。对于这种情况,只能横着放两块骨牌。
示意图来自https://blog.csdn.net/lishuhuakai/article/details/8531214,侵删
编码(C语言)
#include<stdio.h>
long long dp[50];
int main(){
int n = 0;
dp[1] = 1, dp[2] = 2;
for(int i = 3; i <= 50; i++){
dp[i] = dp[i - 1] + dp[i - 2];
}
while(scanf("%d", &n) != EOF){
printf("%lld\n", dp[n]);
}
return 0;
}