class Solution {
public:
int rectCover(int number) {
if(number <= 0)
return 0;
if(number == 1)
return 1;
if(number == 2)
return 2;
else
return rectCover(number-1)+rectCover(number-2);
}
};
本代码借鉴了动态规划法面试题(一):矩形覆盖
首先我们可以想象一个的大矩形,用
个
的小矩阵填满,这是一定可以填的满的。
那么我们想象一下,如果先竖着放一个小矩阵,那么我们还要求这个矩阵的覆盖方法;
如果横着放置,那么必然要成对横着放,这样才符合规矩,因此还要求这个矩阵的覆盖方法。
所以,可以知道:
这样就求出了我们的递推公式了。但是,我们知道递归的实现必须借助栈,而且存在很多重复计算的数据。如果能够保存已求得的子问题的答案,在再次使用的时候调出,就会节省大量的时间。我们可以用一个数组来存放求得的子问题的解,这就是动态规划的思想。
class Solution {
public:
int a[10000];
int rectCover(int number) {
a[1] = 1;
a[2] = 2;
for(int i = 3; i <= number; i++)
a[i] = a[i-1]+a[i-2];
return a[number];
}
};