地址:http://ac.jobdu.com/problem.php?pid=1390
题目1390:矩形覆盖
-
题目描述:
-
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
-
输入:
-
输入可能包含多个测试样例,对于每个测试案例,
输入包括一个整数n(1<=n<=70),其中n为偶数。
-
输出:
-
对应每个测试案例,
输出用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有的方法数。
-
样例输入:
-
4
-
样例输出:
-
5
把长条n*2的覆盖问题分解,第一步,若竖着覆盖一个2*1的方块,那么剩下的为2*(n-1)块,
否则,若横着覆盖,应用两块,覆盖一个2*2的块,剩下2*(n-2),这两种覆盖的方式都各有一种
于是,这个问题等同于递归f(n)=f(n-1)+f(n-2)
<span style="font-size:18px;">#include <stdio.h>
int main(){
int n;
long long a[71];
while(scanf("%d", &n) != EOF) {
a[0] = 1;
a[1] = 1;
for(int i = 2; i <= n; i ++) {
a[i] = a[i - 1] + a[i - 2];
}
printf("%lld\n", a[n]);
}
return 0;
}
/**************************************************************
Problem: 1390
Language: C++
Result: Accepted
Time:0 ms
Memory:1020 kb
****************************************************************/</span>
注意:数组类型为long long。