矩形覆盖
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
比如n=3时,2*3的矩形块有3种覆盖方法:
public class Solution {
public int rectCover(int target) {
if(target<=2){
return target;
}
//pre1对应f(n-1)
//pre1对应f(n-2)
int pre1=2;
int pre2=1;
for(int i=3;i<=target;i++){
int cur=pre1+pre2;
pre2=pre1;
pre1=cur;
}
return pre1;
}
}
其实斐波那契数列的非递归实现
f(n)表示覆盖2*n的矩形的方法数目
f(n-1)表示覆盖2*(n-1)的矩形的方法数目
f(n-2)表示覆盖2*(n-2)的矩形的方法数目
如果最后一步是选择增加一个长度,即如图所示竖着放入一个方块,这个方块只有一种放法,那么对应的方法数即为f(n-1)。
如果最后一步是选择增加一个长度,即如图所示横放入两个方块,这两个方块只有一种放法,那么对应的方法数即为f(n-2)。
所以f(n)=f(n-1)+f(n-2)。