矩形覆盖
题目描述
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
比如n=3时,2*3的矩形块有3种覆盖方法:
![img](https://i-blog.csdnimg.cn/blog_migrate/bfefbc02b2c752273ae7cd74b44f84fe.png)
记忆化搜索
思路与前面的递归题目一样。
时间复杂度O(n)。
class Solution {
public:t
int f[40];
int rectCover(int number) {
if (number <= 2)
{
return number;
}
if (f[number] != 0)
{
return f[number];
}
return f[number] = rectCover(number - 1) + rectCover(number - 2);
}
};
运算简化
class Solution {
public:
int rectCover(int number) {
if (number <= 2)
{
return number;
}
int f0 = 1;
int f1 = 2;
for (int i = 3; i <= number; ++i)
{
int tmp = f1;
f1 = f0 + f1;
f0 = tmp;
}
return f1;
}
};