题目描述:
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
思路分析:
其实这题就是跳台阶的变种题,其核心还是斐波那契数列。
如上图所示:
当n=1时,只有一种方式。
当n=2时,存在2种摆放方式。
当n>=3时,这时候需要考虑先竖着摆放还是先横着摆放的问题。
当先竖着摆放时,还剩下(n-1)*2的宽度,所以有f(n-1)种摆放方式。
当先横着摆放时,还剩下(n-2)*2的宽度,所以有f(n-2)种摆放方式。
所以f(n) = f(n-1)+f(n-2);即追根溯源还是斐波那契数列的问题。
代码如下:
方法1:用递归的方法实现。
public class Solution {
public int RectCover(int target) {
if(target ==0){
return 0;
}
if(target == 1){
return 1;
}
if(target ==2){
return 2;
}else{
return RectCover(target-1) + RectCover(target-2);
}
}
}
方法2:
public class Solution {
public int RectCover(int target) {
if(target ==0){
return 0;
}
if(target == 1){
return 1;
}
if(target ==2){
return 2;
}else{
int[] arr = new int[target+1];
arr[1] = 1;
arr[2] = 2;
for(int i = 3 ; i < target+1 ; i++){
arr[i] = arr[i-1] + arr[i-2];
}
return arr[target];
}
}
}