动态规划,用dp[i][j]表示第i行第j列的格子到终点所需的最小初始值,这题如果从左上往右下递推,就需要同时记录从起点到当前位置的路径和以及从起点到当前位置所需要的最小初始值,比较麻烦。

因此我们可以从右下往左上递推,这样递推到每个格子只需要维护当前位置到起点(这里的起点是右下角了)的最小初始值,最后的dp[0][0](表示从左上角到右下角的最小初始值)就是答案。

对于每一个dp[i][j],它都只与dp[i][j + 1], dp[i + 1][j], dungeon[i][j]有关,如果min(dp[i][j + 1], dp[i + 1][j]) - dungeon[i][j]是正数,那么dp[i][j]就是min(dp[i][j + 1], dp[i + 1][j]) -dungeon[i][j],表示从(i, j)出发只要有不少于min(dp[i][j + 1], dp[i + 1][j]) - dungeon[i][j]个生命值,骑士就能到达右下角。

为什么是min(dp[i][j + 1], dp[i + 1][j]) - dungeon[i][j] ? 这个表达式就是说减去dungeon[i][j]的血量,骑士可以到达一个只需要最小的血量min(dp[i][j +1], dp[i + 1][j])就可以到达右下角的格子。

不过min(dp[i][j + 1], dp[i + 1][j]) - dungeon[i][j]可能是个负数或者0,根据题意,生命值大于0,最少也得是1,所以状态转移方程是dp[i][j] = max(min(dp[i][j + 1], dp[i + 1][j]) - dungeon[i][j], 1);

对于边界状态,最后一行以及最后一列,因为dp[i][j + 1]和dp[i + 1][j]不都存在,所以开数组的时候多开一行一列,把格子最后一行的下一行以及格子最后一列的下一列的dp[i][j]赋值为INT_MAX, 因为状态转移方程是对于下一行和下一列的dp值取min,所以可以对它们赋值成INT_MAX。

另外,对于右下角的格子,考虑到它的dp[i][j + 1], dp[i + 1][j]如果都是INT_MAX,且dungeon[i][j]是负数的情况下会产生溢出,因此我们把右下角dp[i][j + 1]和dp[i + 1][j]都赋值为1,表示减去dungeon[i][j]的生命值之后还剩下1格生命值,这样再往左上递推就不会溢出了。

代码如下:

class Solution {
public:int calculateMinimumHP(vector<vector<int>>& dungeon) {int rows = dungeon.size(), cols = dungeon[0].size();                  //行数和列数vector<vector<int>> dp(rows + 1, vector<int>(cols + 1, INT_MAX));      //多开一行和一列dp[rows - 1][cols] = dp[rows][cols - 1] = 1;                           //右下角的格子的下一行和下一列的格子初始赋值为1,这样就不会溢出for(int i = rows - 1; i >= 0; --i) {                                   for(int j = cols - 1; j >= 0; --j) {dp[i][j] = max(min(dp[i][j + 1], dp[i + 1][j]) - dungeon[i][j], 1);    }}return dp[0][0];}
};

LeetCode174. 地下城游戏相关推荐

  1. leetcode174. 地下城游戏(java)

    地下城游戏 leetcode174. 地下城游戏 题目描述 动态规划 解题思路 代码 动态规划专题 leetcode174. 地下城游戏 来源:力扣(LeetCode) 链接:https://leet ...

  2. LeetCode--174.地下城游戏(动态规划)

    地下城游戏(动态规划) 1. 题目描述 2. 题目分析 3. C语言实现 1. 题目描述 难度:困难 2. 题目分析 这道题是64.最小路径和的进阶版.但是这一题我们不能从左上向右下的顺序,而是**要 ...

  3. 力扣LeetCode174.地下城游戏及Python源码实现

    本题为LeetCode题库中第174题地下城游戏,难度困难,题目请参考这里. 一道比较困难DP题目,其中的难点在于如何定义状态转移方程,所以在这里记录一下.这道题刚开始做一点思路都没有,但是通过解读别 ...

  4. leetcode174. 地下城游戏(动态规划)

    一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主. 骑士的初始 ...

  5. Leetcode--174. 地下城游戏

    一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主. 骑士的初始 ...

  6. LeetCode174——地下城游戏

    我的LeetCode代码仓:https://github.com/617076674/LeetCode 原题链接:https://leetcode-cn.com/problems/dungeon-ga ...

  7. 【普通人题解】LeetCode174. 地下城游戏

    建议先看这个题 这个题 这个题,再看这个题. dfs 显然可以dfs,但是我们就不看了,因为大概率会超时. 动态规划 由于问题问初始的血量最低是多少,dp问题一般是最后一个状态作为输出值,所以对应的, ...

  8. 力扣174. 地下城游戏

    力扣174. 地下城游戏 文章目录 力扣174. 地下城游戏 一.题目描述 二.分析 三.完整代码 一.题目描述 二.分析 这个题一看就可以用动态规划,就需要确定动态规划的状态和选择以及状态转移方程 ...

  9. leetcode题库174 地下城游戏

    地下城游戏 一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主. ...

最新文章

  1. 周刊#003提要:吴恩达团队盘点2019 AI 大事件圣诞 AI 论战
  2. 【杂谈】什么是我心目中深度学习算法工程师的标准
  3. ES6重点--笔记(转)
  4. One order text browser tool
  5. HDLBits答案(25)_编写Testbench
  6. Spring @Value批注
  7. ShardingSphere(六) 读写分离之mysql 主从同步配置
  8. H264--H264解码--5
  9. typescript是像java吗_typescript参照C#/java/swift学习小结
  10. 人力资源管理专业知识与实务(中级)
  11. Python练习小工具——根据Exif的拍摄时间和设备名批量重命名照片
  12. QCC514x-QCC304x(headset)系列(实战篇)之5.1 tone详解
  13. html 脚本错误,脚本错误怎么解决,教您脚本错误怎么解决?
  14. 如何在Vue引入静态图片?
  15. Python爬取、可视化分析B站大司马视频40W+弹幕
  16. Mac下使用Eclipse读java源码
  17. 饱和蒸汽比容计算、 温压补偿系数计算
  18. Ubuntu9.04配置命令宝典
  19. 报错:version magic ‘3.10.0_hifone SMP mod_unload ARMv7 p2v8 ‘ should be ‘3.10.0_s40 SMP mod_unload ARM
  20. python计算平均数_Python标准库——数学运算

热门文章

  1. Android studio 打包release版本 apk 换方式了?
  2. android打开本地音乐播放器,Android8.0打开手机所有的音乐播放器
  3. 物联网卡常见问题及解决方案
  4. android 快速亮暗屏_Android设备闪屏怎么办?手机屏幕一会亮一会暗怎么办
  5. 【Unity3D】动画回调函数、动画事件、动画曲线
  6. 布尔表达式,python代码示例
  7. 【C语言】百玩不腻的扫雷小游戏(初阶到进阶)
  8. 弘辽科技:拼多多店铺类目有哪些?怎么选择类目?
  9. python打包含有参数传递的exe程序
  10. FreeSwitch之调用rtp和deavesdrop传输音频流给远程服务器