我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
思路分析:
类似于斐波那契数列。覆盖分为两种情况:(1)由2*(n-1)的矩形加上一个竖着的2*1的矩形;(2)由2*(n-2)的矩形加上两个横着的2*1的矩形。
f(1)=1; 一个竖着的(|)
f(2)=2; (| |),(二)
f(3)=f(2)+f(1); (| | |),(二 |),(| 二)
递归方法:
public class Solution {
public int RectCover(int target) {
if(target<=2)
return target;
else
return RectCover(target-2)+RectCover(target-1);
}
}
非递归方法:
public class Solution {
public int RectCover(int target) {
if(target<=2)
return target;
int first=1,second=2,total=0;
for(int i=3;i<=target;i++)
{
total=first+second;
first=second;
second=total;
}
return total;
}
}