题目描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
思路:
我刚做此题的时候比较难理解,后来自己看了解析以后,自己在想想就想通了,我就说说我自己的理解。先附上一张图:
图中每一个格子代表单元格
第一部分:
在2 * target的矩形中,当2 * 1的矩形(以下称为小矩形)竖着放时,剩下未放的小矩形的组成的大矩形面积等于2 * (target - 1),也就是当竖着放小矩形时,放置的方法
f(target) = f(target - 1);
第二部分:
当小矩形横着放时,√所表示的矩形位置已经确定,剩下未放置的小矩形组成的大矩形面积等于2 * target - 2,也就是当横着放置小矩形时,放置的方法f(target) = f(target - 2);
第三部门:
第一部分和第二部分结合就为f(target)放置的方法。
注:此题也属于动态规划的范畴,比之前的跳台阶相对难理解些。
代码贴上:
public class Solution {
public int RectCover(int target) {
//2 * target的特殊情况
if(target == 0 || target == 1 || target == 2){
return target;
}
int[] f = new int[target];
f[0] = 1;
f[1] = 2;
int i = 2;
while(i < target){
f[i] = f[i - 1] + f[i - 2];
++i;
}
return f[target - 1];
}
}