动态规划(dynamic programming)之:climbing-stairs(青蛙跳台阶)

 题⽬问的是到达顶端的⽅法数,我们采⽤序列类问题的通⽤分析⽅法,可以得到如下四要素:
1. State: f[i] 爬到第i级的⽅法数
2. Function: f[i]=f[i-1]+f[i-2]
3. Initialization: f[0]=1,f[1]=1
4. Answer: f[n]
尤其注意状态转移⽅程的写法,f[i]只可能由两个中间状态转化⽽来,⼀个是f[i-1],由f[i-1]到f[i]其⽅法
总数并未增加;另⼀个是f[i-2],由f[i-2]到f[i]隔了两个台阶,因此有1+1和2两个⽅法,因此容易写成
f[i]=f[i-1]+f[i-2]+1,但仔细分析后能发现,由f[i-2]到f[i]的中间状态f[i-1]已经被利⽤过⼀次,故f[i]=f[i-
1]+f[i-2]. 使⽤动规思想解题时需要分清『重叠⼦状态』, 如果有重复的需要去重。

int climbStairs(int n) {
        if(n < 0)
            return 0;
        vector<int> res(n+1, 1);
        for(int i = 2; i < n+1; ++i)
            res[i] = res[i-1] + res[i-2];
        return res[n];
    }

或者可以用3个变量来代替上面的数组

int climbStairs(int n) {
        if(n < 1)
            return 0;
        int ret0 = 1, ret1 = 1, ret2 = 1;
        for(int i = 2; i < n+1; ++i){
            ret0 = ret1 + ret2;
            ret2 = ret1;
            ret1 = ret0;
        }
        return ret0;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值