题目;矩形覆盖
题目描述
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
解题思路:
注:X:代表乘以
依旧是斐波那契数列,2 X n的大矩形,和n个2 X 1的小矩形,其中target X 2为大矩阵的大小
有以下几种情形:
(1) target <= 0 大矩形为<= 2 X 0,直接return 1;
(2) target = 1大矩形为2 X 1,只有一种摆放方法,return 1;
(3) target = 2 大矩形为2 X 2,有两种摆放方法,return 2;
(4) target = n 分为两步考虑:
第一次摆放一块 2 X 1 的小矩阵(横着放),则摆放方法总共为f(target - 1);第一次摆放一块1 X 2的小矩阵(竖着放),则摆放方法总共为f(target-2)
因为,摆放了一块1 X 2的小矩阵,对应下方的1 X 2 摆放方法就确定了,所以为f(targte-2)。
代码实现一:递归
public class Solution {
public int RectCover(int target) {
if(target<=0){
return 0;
}
if(target==1){
return 1;
}
if(target==2){
return 2;
}
return RectCover(target-1)+RectCover(target-2);
}
}
代码实现二:循环
public class Solution {
public int RectCover(int target) {
if(target<=0){
return 0;
}
if(target==1){
return 1;
}
if(target==2){
return 2;
}
//return RectCover(target-1)+RectCover(target-2);
int preOne=2;
int preTwo=1;
int sum=0;
for(int i=3;i<=target;i++){
sum=preOne+preTwo;
preTwo=preOne;
preOne=sum;
}
return sum;
}
}