[动态规划]---part1

慈云数据 2024-03-12 技术支持 157 0

前言

作者:小蜗牛向前冲

专栏:小蜗牛算法之路

 专栏介绍:"蜗牛之道,攀登大厂高峰,让我们携手学习算法。在这个专栏中,将涵盖动态规划、贪心算法、回溯等高阶技巧,不定期为你奉上基础数据结构的精彩算法之旅。一同努力,追逐技术的星辰大海。"

 

目录

 一、什么是动态规划

1、什么是动态规划

2、动态规划的学习

二、动态规划刷题

1、第 N 个泰波那契数

a、解题思路:

b、代码 

2、   面试题 08.01. 三步问题

 a、解题思路:

b、代码

3 、746. 使用最小花费爬楼梯

a、解题思路 

b、代码

  4、解码方法

a、解题思路 

b、代码

c、代码优化 

 5、不同路径(medium)

a、解题思路 

b、代码


本期我们将探讨动态规划,并提供5道经典动态规划问题,难度由浅入深。

 一、什么是动态规划

1、什么是动态规划

在学习算法的过程中,我们往往会遇到一些算法题是要用动态规划来解决。

但是做为小白的我们哪里知道动态规划是什么?

从概念上说

动态规划(Dynamic Programming)是一种解决复杂问题的算法设计技术。它通常用于解决具有重叠子问题和最优子结构性质的问题,通过将问题分解为更小的子问题,并利用子问题的解来构建原始问题的解。

看完概念我们知道什么是动态规划,求重叠类子问题的 一般会用到动态规划的思路。

那我们如何求学习动态规划

2、动态规划的学习

对于算法类题目,在我们掌握算法的基本原理后,就是进行大量刷题,进经验的总结。

求解动态规划的五步骤:


1、状态表示


 在求解过程中,我们往往要创建dp表(其实就是数组),状态表示就是我们要找出dp表中值的含义是什么。

状态表 怎么来?

  • 根据题目要求
  • 经验+题目要求
  • 分析题目的过程中,发现重复子问题

     2、状态转移方程


     简单说是和dp[i]有关的一个方程


     3、初始化


    保证在填写dp表的时候不越界


    4、填写顺序 


     根据前面的计算得来,可以从前往后,也可以从后往前。


     5、返回

    根据题目要求+状态表示

     讲完了解题步骤,下面就进行刷题训练。

    特别提醒:后面博客会带领大家由易到难进行刷题,每期都为五题。

    二、动态规划刷题

    1、第 N 个泰波那契数

    泰波那契序列 Tn 定义如下: 

    T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2

    给你整数 n,请返回第 n 个泰波那契数 Tn 的值。

    示例 1:

    输入:n = 4
    输出:4
    解释:
    T_3 = 0 + 1 + 1 = 2
    T_4 = 1 + 1 + 2 = 4
    

    示例 2:

    输入:n = 25
    输出:1389537
    

    提示:

    • 0 2因为从 0----->1的走法我们已经考虑过了

      走法为2


      n=3时候

      从0----->3或者说

      我们让1----->3因为从 0----->1的走法我们已经考虑过了走法为1

      也可以2----->3因为从 0----->2的走法我们已经考虑过了走法为2

      走法为1+1+2=4


      n=4时候

      不管怎么说先走到1,在从1----->4走法为1

      不管怎么说先走到2,在从2----->4走法为2

      不管怎么说先走到3,在从3----->4走法为4

      总共走法:1+2+4=7

      大家这里是不是已经思路清晰起来了 

      1、转态表示

      以i位置为结尾,正好是到达第N个台阶,所以我们认为:

      dp[i]表示:到达i位置时,一共有多少方法。

       2、状态转移方程

      以i位置的状态,最近进的一步进行划分

      从(i-1)--->i   dp[i-1]种走法

      从(i-2)--->i   dp[i-2]种走法

      从(i-3)--->i   dp[i-3]种走法

      所以状态方程为:dp[i]=dp[i-1]+dp[i-2]+dp[i-3] ;

      3、初始化

      这里我们注意我们用不到i==0,因为0台阶的研究没有意义。

        dp[1] = 1, dp[2] = 2, dp[3] = 4;

      4、 填表顺序

      根据前面的推断肯定是从左往右。

      5、返回值

      根据题目要求和dp[i]就为dp[n]

      b、代码

      这题虽然和第一题非常相似但是有细节要处理、

      class Solution {
      public:
          //取模
          const int MOD = 1e9 + 7;
          int waysToStep(int n)
          {
              //处理边界情况:
              if (n == 1 || n == 2)return n;
              if (n == 3)return 4;
              //创建dp表
              vector dp(n + 1);
              //初始化
              dp[1] = 1, dp[2] = 2, dp[3] = 4;
              //填表
              for (int i = 4; i  向下
      

      示例 3:

      输入:m = 7, n = 3
      输出:28
      

      示例 4:

      输入:m = 3, n = 3
      输出:6
      

      提示:

      • 1
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon