当前位置: 首页 > news >正文

【动态规划】路径问题

路径问题

  • 1.最小路径和
  • 2.地下城游戏

在这里插入图片描述

点赞👍👍收藏🌟🌟关注💖💖
你的支持是对我最大的鼓励,我们一起努力吧!😃😃

1.最小路径和

题目链接:64. 最小路径和

题目描述:

在这里插入图片描述
求左上角到右上角最小路径和。注意只能向下向右移动!

算法原理:

1.状态表示

经验 + 题目要求

dp[i][j] 表示:到达 [i][j] 位置时,最小路径和

2.状态转移方程

根据最近一步,划分问题

到达[i][j]有两种情况,[i-1][j],[i][j-1]都可以到,但是我们要找的是到达 [i][j] 最小路径,那[i-1][j],[i][j-1]一定要是最小。而dp[i][j] 表示:到达 [i][j] 位置时,最小的下降路径。然后在加上[i][j]本身的值。所以状态转移方程为

在这里插入图片描述

3.初始化

填表时保证不越界

如果我们开辟和原数组一样大小的dp表,第一行和第一列填表的时候都会越界。因此dp表可以多开一行一列。

在这里插入图片描述

  1. 虚拟节点里面的值,要保证后面填表的结果是正确的
  2. 下标的映射

虚拟节点的值应该放什么呢。先不考虑多加的行和列。没有这些的话,考虑这些填表越界的格子应该填多少。先看第一个格子,第一个格子的意思是dp[0][0]表示达到[0][0]位置的最小值,那没得选就是它本身也就是之前矩阵g[0][0]的值,这个格子的值是上一个格子和左边格子的最小值在加上自己本身,因此第一个格子上面和左边虚拟格子我们给0,

在这里插入图片描述

剩下的虚拟格子也给0吗?不行的。如果是0,那这个虚拟格子里的值就会参与取最小值的运算。会导致填表错误。因此把剩下格子设置为+∞,只把[0][1]和[1][0]位置设置为0就好了。

在这里插入图片描述

当前你也可以直接把第一行和第一列初始化,但是用的更多的还是多开一行一列。
如果做的多,你会发现求最小值,就是dp表先给+∞,仅修改几个位置的值就可以了。同样求最大值,dp表先给-∞,然后修改几个位置的值就可以了。

4.填表顺序

从上到下填写每一行,每一行从左往右

5.返回值

多开一行一列右下角就变成[m][n],所以返回dp[m][n]

class Solution {
public:int minPathSum(vector<vector<int>>& grid) {// 1.创建dp表// 2.初始化// 3.填表// 4.返回值int m = grid.size(), n = grid[0].size();vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MAX));dp[0][1] = dp[1][0] = 0;for(int i = 1; i <= m; ++i)for(int j = 1; j <= n; ++j)dp[i][j] = min(dp[i - 1][j],dp[i][j - 1]) + grid[i - 1][j - 1];return dp[m][n];}
};

2.地下城游戏

题目链接: 174. 地下城游戏

题目分析:

在这里插入图片描述

骑士要从左上角出发到右下角救公主。骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。骑士每次只能向左向右移动。骑士每到一个格子要么就是减去健康点、要么加上健康点、要么不增不加。注意:任何房间都可能对骑士的健康点数造成威胁,也可能增加骑士的健康点数,包括骑士进入的左上角房间以及公主被监禁的右下角房间。也就是说到达右下角救公主也可能减去健康点。

如下面例子,第一个格子是-2,我们可以给个3 ,但是走到-3,骑士就死了。我们也就知道给3不行,然后就给个6,走到右下角骑士也死了也是不行的。因此最终给个7才真正救出公主。
在这里插入图片描述

算法原理:

1.状态表示

经验 + 题目要求

经验我们有两个,1.以某个位置为结尾,巴拉巴拉。 2.以某个位置为起点,巴拉巴拉。

  1. 以某个位置为结尾,巴拉巴拉

dp[i][j] 表示:从起点出发,到达[i][j]位置的时候,所需要的最低初始健康点数。

但是回到刚才的分析,当往下走的时候,发现骑士死了,才知道初始给的健康点数是不对。还需要重新给。显然是不行的。因此以某个位置为结尾这种经验定状态标识是不行的,所以换一种。

在这里插入图片描述

  1. 以某个位置为起点,巴拉巴拉

dp[i][j] 表示:从[i][j]位置出发,到达终点,所需最低初始健康值

2.状态转移方程

还是根据最近的一步,划分问题

以[i][j]位置起点,下一步可以向下向右走。那走到下一步的时候是不是还要保证下一步还可以往下在走啊。假设健康值是x ,然后往右走 是不是要保证 x + d[i][j] >= dp[i][j+1] ----> x >= dp[i][j+1] - d[i][j],又因为所需的是最低初始健康值,因此往右走仅需 x = dp[i][j+1] - d[i][j],同理往下走 x = dp[i+1][j] - d[i][j],又因为所需最低初始健康值所以取它们中最小值。

其实这里还可以这样理解,dp[i][j]表示 从[i][j]位置出发,到达终点,所需最低初始健康值。每次只能向右向下走,[i][j]最近一步 [i][j+1] 和 [i+1][j],那如果知道 dp[i][j+1]和dp[i+1][j] 到达终点,所需最低初始健康值,取它俩中最小,在减去 d[i][j] 健康点的情况不就是dp[i][j]到达终点,所需最低初始健康值了吗。

在这里插入图片描述
但是这里还有一个非常细的细节,如果dp[i][j] 等于一个负数怎么办。也就是说d[i][j] 这里是一个很大的血包,dp[i][j] 为负值 难道要一个死去的骑士要去救公主吗,显示是不合常识的,因此要处理一下。这个血包就足以骑士走接下来的路,因此给骑士一个最低的健康点 1 就行了。

在这里插入图片描述

3.初始化

多给一行一列,不过多给一行一列是给在下面的。所以就没有下标映射的关系了。
只关注,虚拟节点的值,要保证接下来填表正确。

在这里插入图片描述

骑士走到右下角救到公主之后,向右向下走还必须保证骑士活着健康点还必须是最低,因此dp[m][n-1] = dp[m-1][n] = 1,其他虚拟节点的值为了不影响dp[i][j]找最小运算直接给+∞。

在这里插入图片描述

4.填表顺序

从下往上,从右往左

5.返回值

dp[0][0]

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C#中类和结构体的对比
  • Hive中分区(Partition)和分桶(Bucket)区别
  • MBA留学选校中Location的四大考量因素
  • 为呼叫中心创建 SOP 的 10 个好处
  • 优化网络接收缓存减少数据丢包
  • https执行过程,特点,作用
  • 基于深度学习的快速适应任务
  • HarmonyOS应用开发者基础认证,Next版本发布后最新题库
  • 【问题解决方案】npm install报错问题:npm ERR! - 多种解决方案,总有一种可以解决
  • MySQL:CTE 通用表达式
  • 洛克兄弟:E-Bike浪潮下的骑行配件10亿大卖独立站拆解丨出海笔记
  • Android 更换applicationId 后 微信没有回调
  • 【自动化测试工具详解】使用Selenium、JUnit等工具进行自动化测试
  • 漏洞挖掘 | edusrc记一次某中学小程序渗透测试
  • 深入解析汽车VCU:新能源汽车的“大脑”
  • 2017 前端面试准备 - 收藏集 - 掘金
  • C学习-枚举(九)
  • isset在php5.6-和php7.0+的一些差异
  • ng6--错误信息小结(持续更新)
  • Promise面试题,控制异步流程
  • Solarized Scheme
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 翻译:Hystrix - How To Use
  • 免费小说阅读小程序
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 思考 CSS 架构
  • 原生JS动态加载JS、CSS文件及代码脚本
  • Python 之网络式编程
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ‌移动管家手机智能控制汽车系统
  • (20)docke容器
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (42)STM32——LCD显示屏实验笔记
  • (Git) gitignore基础使用
  • (Matlab)使用竞争神经网络实现数据聚类
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (十三)Flink SQL
  • (十一)手动添加用户和文件的特殊权限
  • (四) 虚拟摄像头vivi体验
  • (一)SvelteKit教程:hello world
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • ***原理与防范
  • .NET Core 中插件式开发实现
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .sh
  • /var/spool/postfix/maildrop 下有大量文件
  • @Autowired多个相同类型bean装配问题
  • @component注解的分类
  • @test注解_Spring 自定义注解你了解过吗?
  • [20190401]关于semtimedop函数调用.txt
  • [BZOJ] 2044: 三维导弹拦截