蓝桥杯必备动态规划第二弹-路径问题进阶

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

一、最小路径和

最小路径和

蓝桥杯必备动态规划第二弹-路径问题进阶,动态规划,算法

先看一眼题干什么意思-我们可以知道,左上角到右下角的最小路径和

1.状态表示(第一步其实是最重要,因为他可以确定状态转移方程)

dp[i][j]:到ij位置,路径之和是最小

2.状态转移方程(为什么这么写,首先你要能到ij位置,其次你需要+ij位置的数字)

dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i-1][j-1]

3.初始化

左边可以多一行,上面可以多一行,也就是虚拟节点蓝桥杯必备动态规划第二弹-路径问题进阶,动态规划,算法

因为他是要求最小值,但是左侧,和上面都会有一处影响填表,所以这两个的值不能是0.

4.初始化

从上到下,从左到右

5.返回值 

return dp[i][j]

这个代码正确解法

class Solution {
    public int minPathSum(int[][] grid) {
    int m=grid.length,n=grid[0].length;
    int [][]dp=new int[m+1][n+1]; 
     
    for(int i=2;i<m+1;i++){
        for(int j=2;j<n+1;j++){
        dp[i][0]=Integer.MAX_VALUE;
         dp[0][j]=Integer.MAX_VALUE;
        }
    }
    for(int j=2;j<n+1;j++){
        dp[0][j]=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],dp[i][j-1])+grid[i-1][j-1];
        }
    }
return dp[m][n];
    }
}

二、地下城游戏

地下城勇士

蓝桥杯必备动态规划第二弹-路径问题进阶,动态规划,算法

1.状态表示

dp[i][j]:假如说表示结尾是否可以表示呢?

也就是到达ij位置时候dp[i][j]需要最小的血量

但是到达i j位置他是由上一个[i-1][j]位置决定,然后在加上那个格子[i][j],然后最后剩1滴血起码。

2.状态转移方程

dp[i][j]=min(dp[i-1][j],dp[i][j-1])+dungeon[i][j]

3.初始化

如果能活着最少一滴血,其余是正无穷

蓝桥杯必备动态规划第二弹-路径问题进阶,动态规划,算法

4.顺序

从上到下,从左到右

5.返回值

dp[0][0]

class Solution {
    public int calculateMinimumHP(int[][] dungeon) {
 int m=dungeon.length,n=dungeon[0].length;
    int [][]dp=new int[m+1][n+1]; 
    
    for(int i=0;i<m+1;i++){
        for(int j=0;j<n+1;j++){
        dp[i][n]=Integer.MAX_VALUE;
         dp[m][j]=Integer.MAX_VALUE;
        }
    }
    dp[m-1][n]=dp[m][n-1]=1;
    for(int i=m-1;i>=0;i--){
        for(int j=n-1;j>=0;j--){     
        dp[i][j]=Math.min(dp[i+1][j],dp[i][j+1])-dungeon[i][j]; 
         dp[i][j]=Math.max(1,dp[i][j]);
          
        }
    }
   
return dp[0][0];
    }
}

三、按摩师

蓝桥杯必备动态规划第二弹-路径问题进阶,动态规划,算法

1.状态表示

dp[i]:以i位置结尾的,最大预约时间,但是他应该能更加细节化

f[i]:以i位置结尾的处于休息时间,最大预约时间

g[i]:以i位置结尾的处于完事时间,最大预约时间

2.状态转移方程

f[i]有两种状态第一种就是我最后一个没有选择,但是我前一个一定选了[i-1],所以f[i]=g[i-1],他还有另一种选择,就是也不选i-1的位置,那样的话,大家是不是也很困惑,那样不就不是最大了吗,这样不也没意义吗,其实不然,假如说是【2,1,1,2】这样的,你怎么处理呢】,是不是i-1节点前面的不能选,i-2节点也不能选,最后一个选,是用的g[i],但是g[]g[i]=f[i-1]+d[i]

3.初始状态

可以虚拟节点,可以不用虚拟节点,不用节点的话,g[0]=nums[0]保证这个即可

假如说使用虚拟节点,就是左侧添加一个格子,但是这个格子也是0,所以用不用都行,那么g[1]=nums[0],注意下标的对应。

4.顺序

从左到右

蓝桥杯必备动态规划第二弹-路径问题进阶,动态规划,算法

5.返回值

return Math.max(f[m-1],g[m-1]. 

class Solution {
    public int massage(int[] nums) {
     int m=nums.length;
     if(m==0){
         return 0;
     }
     int []f=new int[m];
     int []g=new int[m];
     g[0]=nums[0];
     for(int i=1;i<m;i++){
         f[i]=Math.max(g[i-1],f[i-1]);
         g[i]=f[i-1]+nums[i];
     }
  
  return Math.max(f[m-1],g[m-1]);
    }
}

四、打家劫舍II

打家劫舍II

蓝桥杯必备动态规划第二弹-路径问题进阶,动态规划,算法

1.状态表示

dp[i]:以i位置结尾的今晚能偷到的最高金额

f[i]:以i位置结尾,偷这个房子,能偷到的最高金额

g[i]:以i位置结尾,不偷这个房子,能偷到的最高金额

蓝桥杯必备动态规划第二弹-路径问题进阶,动态规划,算法

2.状态表示

f[i]=g[i-1]+nums[i]

g[i]=max(f[i-1],g[i-1])

3.初始化

这里有一个卡了我一天的一个细节,就是Maxsum里面初始化,一直我是想的是f[0]=n[0],这个样子。f[a]就其实等于f[0],因为是从a位置开始填写,其次它是从a+1开始,第0天就对应的我们生活中的第一天,因为要对应nums的下标。

4.填表顺序

左到右,两个表一起填写

5.返回值

两者中最大值文章来源地址https://www.toymoban.com/news/detail-712917.html

class Solution {
    public int rob(int[] nums) {
        int n=nums.length;
        if(n==1){
            return nums[0];
        }
    int f= Maxsum(nums,0,n-2);
    int d= Maxsum(nums,1,n-1);   
    return Math.max(f,d);
    }
  public int Maxsum(int []n,int a,int b){
      if(a>b){
          return 0;
      }
    int m=n.length;
    int f[]=new int[m];
    int g[]=new int[m];
    f[a]=n[a];
    
    for(int i=a+1;i<=b;i++){ 
        f[i]=g[i-1]+n[i];
        g[i]=Math.max(f[i-1],g[i-1]);
    }
    return Math.max(g[b],f[b]);
}
}

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

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

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

相关文章

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

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

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

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

    2024年02月15日
    浏览(32)
  • 【动态规划】路径问题

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

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

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

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

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

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

    题目描述: 状态表示: 设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日
    浏览(28)
  • 【动态规划专栏】专题二:路径问题--------1.不同路径

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

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

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

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

    大家好,我是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

领红包