动态规划算法(C++)(1、三步走问题)

本文通过实例讲解了动态规划的概念,以解决三步走问题为例,展示了如何将问题分解为子问题并利用之前子问题的最优解。通过代码实现,帮助读者理解动态规划在计算阶梯上楼方式中的应用。
摘要由CSDN通过智能技术生成

        动态规划是一种解决多阶段决策过程最优化问题的数学方法。在动态规划中,问题被分解为多个子问题,每个子问题的最优解会被保存起来,以便在求解下一个子问题时能够重复利用。


一、动态规划算法的说明

        首先什么是动态规划呢?它是干什么用的呢?其实动态规划就是一种解决问题的方法。每个子问题的“最优解”存放到数组中,这些存放到数组中的“最优解”会被后面的子问题所使用。这样说可能太抽象了,大家可以看下面的习题来进一步的去理解动态规划算法。

1.三步走问题(对应Leetcode面试题08.01.三步问题)

        对应习题链接:面试题 08.01. 三步问题 - 力扣(LeetCode)

   1.题目描述:

   三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。

    2.题目解析:

            最初我刚刚接触这道题的第一感觉是很棘手,这种习题要怎么做完全我从下手!现在让我们用动态规划的思路去理解这道习题会很简单。

        那因为我们一次可以迈1个台阶、2个台阶或者3个台阶,我们第4个台阶的方法总数是不是可以这样算呢?从0到第4个台阶的方法总数,就是从0到第1个台阶的方法总数+从0到第2个台阶的方法总数++从0到第3个台阶的方法总数之和,就是从0到第4个台阶的方法总数(也就是图中的1+2+4=7)(本质是因为可以从1,2,3直接迈到第4个台阶)。所以我们依此类推,可以得到第n个台阶的方法总数是 0到n-1的方法总数+0到n-2的方法总数+0到n-3的方法总数之和。

3.题目代码:

    int waysToStep(int n) {   //n为第n个台阶
        vector<int>dp(n+1);   //创建一个数组名为dp 并且开了n+1个空间
        //if两个为判断边界条件
        if(n==1 || n==2) return n;
        if(n==3) return 4;
        
        dp[1]=1,dp[2]=2,dp[3]=4; //把对应的台阶方法总数存入数组中 用于后面的子问题使用
        for(int i=4;i<=n;i++)
        {
            //dp[i]=dp[i-1]+dp[i-2]+dp[i-3] 依次带入i i=4时就是第4个台阶方法总数等于    
            //第3个台阶方法总数+第2个+第1个 然后存到数组中

            dp[i]=((dp[i-1]+dp[i-2])%1000000007+dp[i-3])%1000000007;
        }
        return dp[n];
    }

总结

        通过一个三步走问题来初步学习动态规划问题,我相信大家都可以很快入门,大家可以点一下链接去实践一下啦!后面我会陆续更新动态规划算法,有需要的话大家可以留意一下专栏后续的文章。希望我的理解可以对大家的学习有所帮助。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值