题目描述 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
解体思路
依旧是斐波那契数列 2n的大矩形,和n个21的小矩形 其中target*2为大矩阵的大小 有以下几种情形:
- ️target <= 0 大矩形为<= 2*0,直接return 1;
- ️target = 1大矩形为2*1,只有一种摆放方法,return1;
- ️target = 2 大矩形为2*2,有两种摆放方法,return2;
- ️target = n 分为两步考虑: 1) 第一次摆放一块 21的小矩阵,则摆放方法总共为f(target - 1) 2) 第一次摆放一块12的小矩阵,则摆放方法总共为f(target-2)
综上:f(n) = f(n-1) + f(n-2)
代码实现:
public class Solution {
public int RectCover(int target) {
if(target <= 2)
return target;
int[] fib = new int[target];
fib[0] = 1;
fib[1] = 2;
for(int i=2; i<target; i++) {
fib[i] = fib[i-1] + fib[i-2];
}
return fib[target - 1];
}
}