题意:
用 n 个 2*1 的小矩形无重叠地覆盖一个 2*n 的大矩形,从同一个方向看总共有多少种不同的方法?
方法一:
动态规划
思路:找规律:n=1时,种类数是1;n=2时,种类数是2;n=3时,种类数是3;.....得到状态转换函数:当前项的值等于前两项之和。
特例:n=0时,种类数是0。
class Solution {
public:
int rectCover(int number) {
if(number==0||number==1||number==2)
return number;
int x=1,y=2,z;
for(int i=3;i<=number;i++){//本项等于前两项之和
z=x+y;//求和
x=y;//更新
y=z;
}
return z;
}
};
时间复杂度:
空间复杂度:![]()
方法二:
记忆化递归
思路:当前项的值等于前两项之和。因此,递归函数为:f(n)=f(n-1)+f(n-2).
class Solution {
public:
int a[40]={0};
int rectCover(int number) {
if(number==0||number==1||number==2)//递归结束条件
return number;
if(a[number])//记忆化搜索
return a[number];
return a[number]=rectCover(number-1)+rectCover(number-2);//当前项的值等于前两项之和
}
};
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号