题解 | #矩形覆盖#
矩形覆盖
https://www.nowcoder.com/practice/72a5a919508a4251859fb2cfb987a0e6
3. 矩形覆盖
3.1 题目描述
题目描述:我们可以用 2*1 的小矩形横着或者竖着去覆盖更大的矩形。请问用 n 个 2*1 的小矩形无重叠地覆盖一个 2*n 的大矩形,从同一个方向看总共有多少种不同的方法?
实例1:
比如n=3时,2*3的矩形块有3种不同的覆盖方法(从同一个方向看):
3.1 递归
这题的数据量小,递归仍然能AC
class Solution {
public:
int rectCover(int num) {
if(num <= 2) return num;
return rectCover(num-1) +rectCover(num-2);
}
};
3.2 动态规划
res[i]
表示有i
种方式来放置矩形
class Solution {
public:
int rectCover(int num) {
int res[num + 1];
res[0] = 0, res[1] = 1, res[2] = 2;
for (int i = 3; i <= num; ++i) {
res[i] = res[i - 1] + res[i - 2];
}
return res[num];
}
};
注意到res
数组可以省略,代码如下
class Solution {
public:
int rectCover(int num) {
if (num <= 2) return num;
int num1 = 1, num2 = 2, res = -1;
for (int i = 3; i <= num; ++i) {
res = num1 + num2;
num1 = num2;
num2 = res;
}
return res;
}
};