题目描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
考虑递归求解:
如果第一个矩形竖着放,则剩下2×(n-1)的矩形区域需要覆盖;如果第一个矩形横着放,则剩下2×(n-2)的矩形区域需要覆盖。
public int RectCover(int target) { if(target == 0 || target == 1 || target == 2) { return target; }else { return RectCover(target - 1) + RectCover(target -2); } }
考虑到中间有很多重复计算的问题,我们定义一个数组要保存中间结果:
private int[] arr = new int[100]; public int RectCoverII(int target) { if(arr[target] != 0) { return arr[target]; } if(target == 0 || target == 1 || target == 2) { return target; }else { return arr[target] = RectCoverII(target - 1) + RectCoverII(target - 2); } } @Test public void test() { System.out.println(RectCoverII(12)); }
本地测试结果准确,貌似牛课的在线编译器有些问题...
接下来是动态规划的解法:
private int[] arr = new int[100];
public int RectCoverIII(int target) { arr[1] = 1; arr[2] = 2; for (int i = 3; i <= target; i++) { arr[i] = arr[i-1] + arr[i-2]; } return arr[target]; } @Test public void test() { System.out.println(RectCoverIII(12)); }