动态规划之跳台阶

         

题目描述:有 N 阶楼梯,每次可以上一阶或者两阶,求有多少种上楼梯的方法

         先来分析下这个问题:

         当N=1时,这个很好理解,只能跨1步这一种了

         当N=2时,因为你每次可以跨1步或2步,那就是走2步或走两个1步

         当N=3时,因为你可以跨1步或2步,那你在台阶1或台阶2都能行,那后面就要计算到台阶1有多少种走法,到台阶2有多少种走法,然后2着相加,依次逆推

        当N=4时,那你在台阶4或台阶3都能行,那后面就要计算到台阶3有多少种走法,到台阶4有多少种走法,然后2着相加,依次逆推

        总结如下,你会发现这是斐波拉切数列,但是使用递归出出现重复计算问题,所以选择动态规划算法。

         第一层:1种,记为f(1)=1(边界)

         第二层:2种(走2步或走两个1步),记为f(2)=2

         第三层:3种(在第一层走2步或在第二层走1步),记为f(3)=f(1)+f(2)

         第四层:5种(在第二层走2步或在第三层走1步),记为f(4)=f(2)+f(3)
 

class Solution {
public:
    int dynamic(int n) {
        if(n < 3)
            return n;
        else{
            int i = 1;
            int j = 2;
            int res = 0;
            for(int k = 0; k < n - 2; k++){从第三层开始计算
                res = i + j;
                i = j;
                j = res;
            }
            return res;
        }
    }
};
 
 
int main(){
    Solution s;
 
    int n = s.dynamic(4);
    std::cout<< "n=" << n << std::endl;
}

运行打印:n=5

i,j首先赋边界值,res保存i+j的值,每次前进,i,j,res的值都会被赋到前面结果的值。上面的算法是底向上,递归相当于自顶向下,避免了重复计算

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盼盼编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值