题目描述
我们可以用2×1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2×1的小矩形无重叠地覆盖一个2×n的大矩形,总共有多少种方法?
解题思路:n=1时,有1种方法;n=2时,有2种方法;
所以要覆盖2×n时:
若摆放一块2×1小矩阵,则摆放方法共为f(n-1);
若摆放一块1×2小矩阵,则摆放方法共为f(n-2)。因为大矩阵为2×n,在第一排上横向防止小矩形,则第二排上必须横向放置小矩形,所以这两块的摆放方法都确定了,于是剩下的放置方法共为f(n-2)。
这就是一道变相的斐波那契数列。解题思路与剑指Offer-斐波那契数列一样。
最优解
// 动态规划,自底向上
public class Solution {
public int RectCover(int target) {
if(target<=2)
return target;
int f1 = 1;
int f2 = 2;
int f3 = 0;
for(int i=3;i<=target;i++){
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
return f3;
}
}