剑指Offer 矩形覆盖

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); 
    }
};

本代码借鉴了动态规划法面试题(一):矩形覆盖

首先我们可以想象一个2*n的大矩形,用n2*1的小矩阵填满,这是一定可以填的满的。

那么我们想象一下,如果先竖着放一个小矩阵,那么我们还要求2*(n-1)这个矩阵的覆盖方法;

如果横着放置,那么必然要成对横着放,这样才符合规矩,因此还要求2*(n-2)这个矩阵的覆盖方法。

所以,可以知道:

f(n) = f(n-1)+f(n-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];
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值