10.矩形覆盖
题目描述
我们可以用2 * 1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2 * 1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
比如n=3时,2*3的矩形块有3种覆盖方法:
示例1.
输入
4
返回值
5
思路:
假设:n块矩形有f(n)种覆盖方法。进行逆向分析,要完成最后的搭建有两种可能。
- 通过n-1个矩形,在添加一个矩形,能完成覆盖
- 通过n-2个矩形,在添加两个矩形,能完成覆盖
故f(n) = f(n-1) + f(n-2),还是一个斐波那契数列,因此本题也是使用动态规划的思想解决。
- 定义状态:int dp[target.length+1],dp[i]表示覆盖 i 个矩形,可以有多少种覆盖方法。
- 状态转移方程:dp[i] = dp[i-1] + dp[i-2]
- 初始化:dp[1] =1,dp[2] =2
代码实现:
public class Solution {
public int RectCover(int target) {
if (target <= 0) return 0;
if (target == 1) return 1;
if (target == 2) return 2;
int[] dp = new int[target + 1];
//初始化
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i < dp.length; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[target];
}
}