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

详解LeetCode地下城游戏(动态规划)——区分两种状态表示形式

地下城游戏

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

状态表示:
按照以往题的表示,dp[i][j]表示:从起点(0,0)位置到达(i,j)位置时,所需的最小初始健康值。但是如果这么去表示,不仅要考虑到达(i,j)位置的最小初始健康值,由于魔法球的存在,还需要考虑到达(i,j)位置时的健康值,因为魔法球会对算后续位置的最小初始健康值产生影响

下面用题目中的示例1为例,演示:
在这里插入图片描述
由此可知,到达魔法球位置所需的最低初始健康值和上一次的最低初始健康值保持一致,而魔法球会增加健康值,这就会对后面的结果产生影响,因此我们不仅要考虑到达(i,j)位置的最小初始健康值,还需要考虑到达(i,j)位置时的健康值,以保证后续结果的正确性

因此,我们可以试着用dp[i][j]表示:以(i,j)位置为起点,到达终点位置时,所需的最小健康值。当(i,j)位置是魔法球时,可以用之前的dp[i+1][j]和dp[i][j+1]中的最小健康值减去治疗量,就能得到当前的位置到达终点位置时所需的最小健康值dp[i][j](注意:dp[i][j]不能小于0,最小值为1);当(i,j)位置是恶魔时,也是这样处理,实际上就是加上了需要扣除的健康值
在这里插入图片描述
通过这种状态表示,我们最终能够求得结果!

总结:

  1. 这道题的难点在于怎么去处理健康值增加的问题,健康值的增加不能为之前的损失提供帮助,只会对后续有帮助
  2. 如果按照第一种状态表示,dp[i][j]仅仅只表示了从(0,0)位置到达(i,j)位置所需的最小初始健康值,而由于魔法球的存在,导致后续的健康值会增加,因此我们还需要去记录当前位置的健康值,以保证后续计算最小初始健康值的正确性
  3. 如果按照第二种状态表示,dp[i][j]表示从(0,0)位置出发,按照最优路径到达(i,j)位置时,还需要剩余的最小健康值(为了到达终点后,健康值为1)。即dp[i][j]不仅表示了从(i,j)位置到达终点位置所需的最小初始健康值,还表示了从(0,0)位置出发到达(i,j)位置时,所需剩余的最小健康值(即当前健康值)
  4. 比较两种状态表示,可知,第二种表示更合理,更方便后续的填表

状态转移方程
dp[i][j] = min(dp[i+1][j],dp[i][j+1])-d[i][j],dp[i][j] = max(1, dp[i][j])

初始化
创建表时,多创建一行(第m行)和一列(第n列),除dp[m][n-1] = 1(dp[m-1][n] 也可初始化为1,表示救出公主后还需剩余1点健康值),其他都初始化为正无穷(以防对填表产生影响)

填表顺序
从下往上,每一行从右往左

返回值
dp[0][0]

实现代码

class Solution {public int calculateMinimumHP(int[][] dungeon) {//1.创建dp表int m = dungeon.length;int n = dungeon[0].length;int[][] dp = new int[m+1][n+1];//2.初始化for(int row = 0; row < m+1; row++) {dp[row][n] = Integer.MAX_VALUE;}for(int col = 0; col < n+1; col++) {dp[m][col] = Integer.MAX_VALUE;}dp[m][n-1] = 1;//3.填表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]);}}//4.返回值return dp[0][0];}
}
http://www.lryc.cn/news/500844.html

相关文章:

  • .NET正则表达式
  • k8s 为什么需要Pod?
  • CV(3)--噪声滤波和特征
  • LDR6500:音频双C支持,数字与模拟的完美结合
  • python web app开发
  • redis数据结构和内部编码及单线程架构
  • 【unity小技巧】分享vscode如何进行unity开发,且如何开启unity断点调试模式,并进行unity断点调试(2024年最新的方法,实测有效)
  • AI大模型学习笔记|人工智能的发展历程、智能体的发展、机器学习与深度学习的基本理论
  • C#实现一个HttpClient集成通义千问-多轮对话功能实现
  • Java Web 7 请求响应(Postman)
  • Android APP自学笔记
  • Linux 系统报打开的文件过多
  • javaWeb之过滤器(Filter)
  • ModStartBlog v10.0.0 发布时间自定义,多图快速粘贴,博客编辑器升级
  • Unexpected token ‘<‘, “<!doctype “... is not valid JSON
  • 24/12/9 算法笔记<强化学习> PPO,DPPO
  • Linux下编译安装METIS
  • 【数据库】关系代数和SQL语句
  • amazon亚马逊滑动识别验证码
  • Android Studio 创建虚拟设备的详细图文操作教程
  • 网络安全法-附则
  • CSS核心(上)
  • 深度学习常用损失函数介绍
  • HarmonyOS-中级(四)
  • React v19稳定版发布12.5
  • 【毕业设计选题】深度学习类毕业设计选题参考 开题指导
  • NanoLog起步笔记-4-Server端的两个线程
  • linux zookeeper安装并服务化
  • 很简单,但是很实用。把docker run改写成docker compose。
  • DAMODEL丹摩|丹摩平台:AI时代的开发者福音