题目描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
(根前面,斐波那契数列,青蛙跳台阶,变态跳台阶是一个类型题目)
思路:(采用数学归纳法)
1. 因为2*1的小矩阵有2种摆放方式,横着,竖着;当n=1时,只能竖着摆放,共1种方法;
2. 当n=2时,都竖着放1种方法,横着放一种方法;一共2种方法;
3. 当n=3时,a.先竖着放,剩下的转为f(2)种放法;b.先横着放,剩下转为f(1)种放法;f(3)=f(2)+f(1)
4. 当n=4时,f(4)=f(3)+f(2)+f(1) 种放法
当n=n时,放法有f(n)=f(n-1)+f(n-2)+...+f(1)种
//递归实现
public int RectCover(int target) {
if(target <= 2){
return target;
}
return RectCover(target-1)+RectCover(target-2);
}
牛客网运行:
public int RectCover(int target) {
if(target <= 2){
return target;
}
//用2个指针one,two指像前面2个数
int one = 1;
int two = 2;
int res = 0; //用res表示当前当数,因为不需要知道前面n-1个放法,所以只保存最后一个方法数即可
for(int i = 3; i <= target; i++){
res = one + two;
one = two;
two = res;
}
return res;
}
牛客网运行: