矩形覆盖
题目描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
思路:最初看到这题,只能通过画图归纳来寻找规律.
n=1,return 1;
n=2,return 2;
n=3,return 3;
n=4,return 5;
......
设置一个辅助数组dp,dp[i]为n=i时,共有的方法数。可以看出规律可能是dp[i] = dp[i-1]+dp[i-2]。
这个时候换个角度反向思考一下,我们有一个想要覆盖好的矩阵,形状为2*n,当我们想由2*(n-1)得到它时,只能在其上加一个横着的,而我们想由2*(n-2)得到它时,我们只能加两个竖着的(加两个横着的不行,因为当加一个横着的时候就转化为了2*(n-1),而此时只有再加一个横着的,这就和2*(n-1)得到2*n这个变化方法重复了)
所以可以证明上述猜测的结论是正确的,代码相应就很简单了。
1 public int RectCover(int target) { 2 if(target<=2) return target; 3 int[] dp = new int[target+1]; 4 dp[1] = 1; 5 dp[2] = 2; 6 for(int i=3;i<=target;i++){ 7 dp[i] = dp[i-1]+dp[i-2]; 8 } 9 return dp[target]; 10 }