蓝桥杯必备——动态规划“路径问题”以及这种题的小结

这篇具有很好参考价值的文章主要介绍了蓝桥杯必备——动态规划“路径问题”以及这种题的小结。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

回顾java数组部分知识

int[][]m=new int[2][3] 表达的含义是,两行,三列。

蓝桥杯必备——动态规划“路径问题”以及这种题的小结,蓝桥杯,动态规划,职场和发展

一、不同路径

不同路径

蓝桥杯必备——动态规划“路径问题”以及这种题的小结,蓝桥杯,动态规划,职场和发展

首先这个题我们分五步走

1.状态表示(按照经验+题目要求)

一般都是以···为结尾或者以···为起始

这道题我们就以dp[i][j]为他要求的到达结尾有多少条路径

此时你要思考一个东西,有多少条路径,他是怎么来的来考虑第二个状态转移方程。

2.状态转移方程

蓝桥杯必备——动态规划“路径问题”以及这种题的小结,蓝桥杯,动态规划,职场和发展

3.初始化

初始化我们采用相当于取巧的一个方式,采用虚拟节点,我们看到上面的状态转移方程,可能就思考一件事,我们会不会出现越界现象,比如最上面的那几个,无法进行-1操作的。

所以我们用虚拟节点,给你包一下,目的是不让他产生越界,红色的都是虚拟的

蓝桥杯必备——动态规划“路径问题”以及这种题的小结,蓝桥杯,动态规划,职场和发展

但是我们使用虚拟节点是有规则的:

1.虚拟节点里面的值,需要保证后面填表是正确的。

那么来思考一下,怎么虚拟节点的格子怎么处理呢,首先你要清楚一件事情,假如只有起点,也就是1*1,那么是不是只有一种,所以要保证起点是1,那么假如是1*2,1*3,是不是也只有一种走法,就是从起点一直向右走,那么再来想出现2*1,的话是不是起点只能往下走,也就只有一种走法,以此类推,所以只需要保证dp[0][1]=1或者dp[1][0]=1,二者不可都为1啊

2.下标的映射,原先表和这个表的对应关系

4.填表顺序

从上倒下,从左到右,

5.返回值

dp[i][j]

最后代码之前,给大家整一下数组,

double[]mark=new double[5],其中的下表是0,1,2,3,4。

这是对应的完整代码蓝桥杯必备——动态规划“路径问题”以及这种题的小结,蓝桥杯,动态规划,职场和发展

class Solution {
    public int uniquePaths(int m, int n) {
     int [][]dp=new int[m+1][n+1];
     dp[0][1]=1;
     for(int i=1;i<m+1;i++){
     for(int j=1;j<n+1;j++){
     dp[i][j]=dp[i-1][j]+dp[i][j-1];
     }
}
return dp[m][n];

    }
}

二、不同路径II

不同路径II

蓝桥杯必备——动态规划“路径问题”以及这种题的小结,蓝桥杯,动态规划,职场和发展

这个题也是一样五步走,

1.状态表示(按照经验+题目要求)

一般都是以···为结尾或者以···为起始

这道题我们就以dp[i][j]为他要求的到达结尾有多少条路径

此时你要思考一个东西,有多少条路径,他是怎么来的来考虑第二个状态转移方程。

2.状态转移方程

还是我们的那个dp[i][j]=d[i-1][j]+dp[i][j-1],但是这个题和上一个题有区别,就是这个题多个障碍物,我们该如何处理这个障碍物呢?

我的刚开始做的时候很迷惑,在想这个障碍物改咋整,假如他不是我的终点,但是他又正好在经过终点的路上。其实这是我思维的一个误区,因为我其实已经选定好从结尾开始看了。

从结尾看就两种情况:

1.障碍物在终点处:在终点,肯定就到不了,就是0呗

2.障碍物不在终点:不在终点就是要想,他正常是左边的+上面的,遇到障碍物就和上面一样,视为0即可

3初始化:和上面一样。

4.填表顺序

从上倒下,从左到右,

5.返回值

dp[i][j]

这里在引入一个小知识

(int[][] ob) {

int m=ob.length,n=ob[0].length;蓝桥杯必备——动态规划“路径问题”以及这种题的小结,蓝桥杯,动态规划,职场和发展

当二维数组的时候,m表示二维数组的列,n表示行数

class Solution {
    public int uniquePathsWithObstacles(int[][] ob) {
     int m=ob.length,n=ob[0].length;
     int[][]dp=new int[m+1][n+1];
     dp[0][1]=1;
     for(int i=1;i<m+1;i++){
         for(int j=1;j<n+1;j++){
//这里容易产生一个误区,考虑原来数组是0的部分,我刚开始是考虑1的所以导致想不明白假如我是1,我给障碍物赋值为0,问题障碍物本身就0。
//然后看一眼题解,发现是把没有石头的部分,去那么算
             if(ob[i-1][j-1]==0){
                dp[i][j]=dp[i-1][j]+dp[i][j-1];
             }
            
         }
     }
return dp[m][n];
    }
}
class Solution {
    public int uniquePathsWithObstacles(int[][] ob) {
     int m=ob.length,n=ob[0].length;
     int[][]dp=new int[m+1][n+1];
     dp[0][1]=1;
     for(int i=1;i<m+1;i++){
         for(int j=1;j<n+1;j++){
             if(ob[i-1][j-1]==1){
//我按照我的想法来一遍,发现不是误区,其实也是对的,只是说,这个需要赋值为0(不写赋值也可)之后,就要跳到下一个,不然的话,他就相当于没有障碍物了
                 dp[i][j]=0;
                 continue;
             }
             dp[i][j]=dp[i-1][j]+dp[i][j-1];
         }
     }
return dp[m][n];
    }
}

三、珠宝最高价值

珠宝

蓝桥杯必备——动态规划“路径问题”以及这种题的小结,蓝桥杯,动态规划,职场和发展

他和上面的区别,就是他的内部是有自己的数字的,所以我们需要算出来可以拿的最大价值。

1.状态表示:

dp[i][j]:表示在ij位置,获取到的最高价值,

2.状态转移方程

dp[i][j]=MAX(dp[i-1][j],dp[i][j-1])+frame[i][j];       左边和上边,看哪个更大,则说明有更高的价值,再加上当前这个地方的价值就构成了得到的最高价值。

3.初始化

初始化-还是防止越界问题,要出现虚拟节点

蓝桥杯必备——动态规划“路径问题”以及这种题的小结,蓝桥杯,动态规划,职场和发展

只有保证虚拟节点都是0,才不会导致,周围的受到影响,因为他是求的最大值,所以0不会收到影响

4.填表的顺序,从左到右,从上到下。

5.返回值dp[i][j]

蓝桥杯必备——动态规划“路径问题”以及这种题的小结,蓝桥杯,动态规划,职场和发展

class Solution {
    public int jewelleryValue(int[][] frame) {
  int m=frame.length,n=frame[0].length;
  int [][]dp=new int[m+1][n+1];
   for(int i=1;i<m+1;i++){
      for(int j=1; j<n+1;j++){
          dp[i][j]=Math.max(dp[i][j-1],dp[i-1][j])+frame[i-1][j-1];
      }
   }
  
  return dp[m][n];
    }
}

四、下降路径最小和

下降路径最小和

蓝桥杯必备——动态规划“路径问题”以及这种题的小结,蓝桥杯,动态规划,职场和发展

1.状态表示

用经验得到

dp[i][j]以i,j位置结尾的下降路径最小和

2。状态转移方程(这里说一下,你的状态方程是根据你的选择的点想法去处理的。

dp[i][j]=min(dp[i-1][j],dp[i-1][j+1],dp[i-1][j+2])+m[i][j]    (这个位置是最左边)

dp[i][j]=min(dp[i-1][j],dp[i-1][j],dp[i-1][j+1])+m[i][j]      (这个就是中间的)

3.初始化

初始化是根据你的状态转移方程决定的

假如说你的这个最左边(红色的是添加的虚拟节点)蓝桥杯必备——动态规划“路径问题”以及这种题的小结,蓝桥杯,动态规划,职场和发展

中间的话就是这样需要

蓝桥杯必备——动态规划“路径问题”以及这种题的小结,蓝桥杯,动态规划,职场和发展

蓝桥杯必备——动态规划“路径问题”以及这种题的小结,蓝桥杯,动态规划,职场和发展

填表顺序:从上到下,从左到右

返回值:min(dp[i][j-1],dp[i][j],dp[j+1])蓝桥杯必备——动态规划“路径问题”以及这种题的小结,蓝桥杯,动态规划,职场和发展


class Solution {
    public int minFallingPathSum(int[][] matrix) {
    int m=matrix.length,n=matrix[0].length; 
    int [][]dp=new int[m+1][n+2];
    for(int i=1;i<m+1;i++){
        dp[i][0]=Integer.MAX_VALUE;
        dp[i][n+1]=Integer.MAX_VALUE;
    }
    for(int i=1;i<m+1;i++){
        for(int j=1;j<n+1;j++){
        dp[i][j]=Math.min(dp[i-1][j-1],Math.min(dp[i-1][j],dp[i-1][j+1]))+matrix[i-1][j-1];
        }
    }
//要学会给无穷大的值
int ret=Integer.MAX_VALUE;
for(int j=1;j<n+1;j++){
ret=Math.min(ret,dp[m][j]);
}
return  ret;
    }
}

最后总结

刷半天题,我感觉动态规划就像是说,你玩超级马里奥,从你通关的角度看,假如说往回看,你发现你通关了,其中你发现掉进水管子也能通关,但是掉进水管子是特殊情况,怎么说呢,就想是,你看到特殊情况了,但是他也是你的计划中的一员文章来源地址https://www.toymoban.com/news/detail-712918.html

到了这里,关于蓝桥杯必备——动态规划“路径问题”以及这种题的小结的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 动态规划|【路径问题】|931.下降路径最小和

    目录 题目 题目解析 思路 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 代码 931. 下降路径最小和 给你一个  n x n  的  方形  整数数组  matrix  ,请你找出并返回通过  matrix  的 下降路径   的   最小和  。 下降路径  可以从第一行中的任何元素开始,并从每一

    2024年04月13日
    浏览(33)
  • 【动态规划】路径问题

    冻龟算法系列之路径问题 本文为动态规划的第二章:路径问题,重点讲解关于路径有关的问题,上一篇文章是一维的,那么路径问题就是二维的,通过题目可见需要创建二维的dp表,而以下将通过“解题”的方式去学习动归知识! 创建什么样的dp表,其实看题目就可以看出来

    2024年02月09日
    浏览(30)
  • 动态规划-路径问题

    题目描述: 状态表示: 设dp[i][j]表示到达(i,j)位置时的路径数目。 状态转移方程: dp[i][j]=dp[i-1][j]+dp[i][j-1]。这里分析起来很简单,因为这算是很经典的问题了。机器人只能向下或者向右走,所以到达(i,j)就有两种方式,分别是从(i-1,j)向下以及(i,j-1)向右,那么到达(i,j)位置的

    2024年04月17日
    浏览(27)
  • C++--动态规划路径问题

    1.不同路径 力扣 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径

    2024年02月15日
    浏览(31)
  • 动态规划——路径问题

    目录 什么是路径问题? 练习 练习1:不同路径  练习2:不同路径II 练习3:珠宝的最高价值 练习4:下降路径最小和 练习5:地下城游戏 动态规划中的路径问题: 指在一个给定的网格中,从起点到终点有多条可能的路径,每条路径都有一个特定的权重或成本,动态规划路径问

    2024年04月27日
    浏览(33)
  • 动态规划之路径问题

    1.题目链接:不同路径 2.题目描述: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? 3.问题分析: 对于 动态

    2024年02月11日
    浏览(36)
  • 【动态规划】路径问题_不同路径_C++

    题目链接:leetcode不同路径 目录 题目解析: 算法原理 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 编写代码 题目让我们求总共有多少条不同的路径可到达右下角; 由题可得: 机器人位于一个  m x n   网格; 机器人每次只能向下或者向右移动一步; 我们拿示例

    2024年02月05日
    浏览(32)
  • 【动态规划专栏】专题二:路径问题--------1.不同路径

    本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:动态规划专栏 🚚代码仓库:小小unicorn的代码仓库🚚

    2024年02月20日
    浏览(33)
  • 刷题之动态规划-路径问题

    大家好,我是jiantaoyab,开始刷动态规划的题目了,要特别注意初始化的时候给什么值。 动态规划5个步骤 状态表示 :dp数组中每一个下标对应值的含义是什么- dp[i]表示什么 状态转移方程: dp[i] 等于什么 1 和 2 是动态规划的核心步骤,第三步是初始化,保证填表的时候不越界

    2024年04月13日
    浏览(23)
  • 【算法专题】动态规划之路径问题

    题目链接 - Leetcode -62.不同路径 Leetcode -62.不同路径 题目:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? 示

    2024年01月24日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包