题目:http://ac.jobdu.com/problem.php?pid=1390
-
题目描述:
-
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
-
输入:
-
输入可能包含多个测试样例,对于每个测试案例,
输入包括一个整数n(1<=n<=70),其中n为偶数。
-
输出:
-
对应每个测试案例,
输出用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有的方法数。
-
样例输入:
-
4
-
样例输出:
-
5
分析:大矩形 大小为 2*1 时 有 1 种
2 *2 时 有 2 种
2 *3 时 有 3 种 即 在 2*1 的矩形 放置 2个横着的小矩形 变成 2*3 的矩形
或者 在 2*2 的 矩形 放置1个竖着的小矩形 变成2*3的矩形
可得递推公式: dp[x] = dp[x-1] + dp[x-2] 发现为 Fibonacci
#include <stdio.h>
long long dp[75];
int main(void)
{
int n;
dp[1] = 1;
dp[2] = 2;
for(n=3; n<=70; n++)
dp[n] = dp[n-1] + dp[n-2];
while(scanf("%d", &n)!=EOF){
printf("%lld\n", dp[n]);
}
return 0;
}