题目描述:
我们可以用2X1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2X1的小矩形无重叠地覆盖一个2Xn的大矩形,总共有多少种方法?
示例:
比如n=3时,2X3的矩形块有3种覆盖方法:
解题思路:
将使用n个2X1的小矩阵去覆盖一个2Xn的大矩形的覆盖方法数量记为f(n),那么很容易可以得出f(1)=1,f(2)=2
。要覆盖一个2Xn的大矩阵时,首先覆盖一个2X1的小矩阵,有两种覆盖方法:
(1)一种是竖着覆盖,那么还剩下一个2X(n-1)的矩阵,这个矩阵的覆盖方法数量为f(n-1);
(2)另一个种是横着覆盖,那么必须还有横着放一个2X1的小矩阵,这时候还剩下一个2X(n-2)的矩阵,该矩阵的覆盖方法数量为f(n-2),因此可以得出递推公式为当n>2时,f(n)=f(n-1)+f(n-2)
。
这种问题的解法可以参考剑指 Offer 10- I. 斐波那契数列的解法。
实现代码:
//矩形覆盖问题
public int RectCover(int target) {
if(target <= 2)
return target;
int pre1 = 1;
int pre2 = 2;
int res = 0;
for(int i = 3; i <= target; i++){
res = pre1 + pre2;
pre1 = pre2;
pre2 = res;
}
return res;
}