本题为LeetCode题库中第174题地下城游戏,难度困难,题目请参考这里。

一道比较困难DP题目,其中的难点在于如何定义状态转移方程,所以在这里记录一下。这道题刚开始做一点思路都没有,但是通过解读别人的思想一下就明白了。

首先一看到这道题,思路肯定是DP来做:直觉从左上出发往右或者往下走这样去找规律,从而得到dp的状态转移方程。在这里建议先把这道题做了。本题有点特殊,如果没有 至少 这个条件从左上往右下推找规律得到状态转移方程的思路应该是可以的。这里我们不去讨论从左上往右下的思路,直接想从右下往左上推。

首先,我们不去考虑二维的复杂情况,考虑二维数组为1*n或者n*1的情况。那么有:

解释一下,比如最后一点是-5那么dp数组在这个位置的数值至少为6才能满足6-5>=1,往前为2那么这个位置的dp数组至少为6-2=4,也就是说在这个位置是4加上2在到最后-5也能满足骑士在每个位置的生命值都是>=1的。那么dp数组每个位置的数值就是max(1, dp[0][i+1]-dungeon[o][i]),因为骑士在每个点的数值都要>=1,所以不能为负至少都要为1。好,理解了一行或者一列的情况,下面我们来考虑二维的复杂情况

解释一下,我们对最后一列和最后一行的dp数组进行特殊处理,因为它只和下一行的元素和下一列的元素有关。所以这里i和j从n-2和m-2开始。再来看转移方程,首先看dp_min代表的是当前位置dp[i][j]要从dp[i-1][j]或者dp[i][j-1]向左或者向上移动得到,当然我们选择其中最小的值,因为题目中要求的是求初始最小的生命值。我们选择这个最小的生命值然后和dungeon[i][j]做减法,上面分析了要从该值和1中选择一个max作为dp[i][j]的值,至此这道题的整个算法的核心思想就讲完了。

总结一下这道题:一道dp困难题目,虽然是hard题目,但是做完了感觉没那么难,但是开始不知道从后往前推那就麻烦了。所以dp这种题一定要从多个角度考虑,这个只能见多识广才能有经验。代码如下,可以把变量名称定义简化一下。

class Solution:def calculateMinimumHP(self, dungeon: List[List[int]]) -> int:dp_min = 0dp = [[1 for _ in range(len(dungeon[0]))] for _ in range(len(dungeon))] #定义dp矩阵dp[-1][-1] = max(1, 1-dungeon[-1][-1]) #把最后一个元素定义好for i in range(len(dungeon)-2, -1, -1):dp[i][len(dungeon[0])-1] = max(1, dp[i+1][len(dungeon[0])-1]-dungeon[i][len(dungeon[0])-1]) #处理最后一行for j in range(len(dungeon[0])-2, -1, -1): #处理最后一列dp[len(dungeon)-1][j] = max(1, dp[len(dungeon)-1][j+1]-dungeon[len(dungeon)-1][j])for i in range(len(dungeon)-2, -1, -1): #根据状态转移方程更新dp数组for j in range(len(dungeon[0])-2, -1, -1):dp_min = min(dp[i+1][j], dp[i][j+1])dp[i][j] = max(1, dp_min-dungeon[i][j])return dp[0][0] #返回dp开始的头元素也就是至少需要的生命值

力扣LeetCode174.地下城游戏及Python源码实现相关推荐

  1. 力扣 174. 地下城游戏 DFS + Python

    原题链接: 力扣 备注:最初做本题目是用的动态规划:在做了一些DFS题目之后,发现本题也可以用DFS来做. 一 特别注意 1. 需要特别注意:假设初始时刻的健康点数为Init,那么在进行下一步搜索之前 ...

  2. 力扣174. 地下城游戏

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

  3. 力扣——174.地下城游戏(困难难度)——万能的递归与动态分析

    力扣--174. 地下城游戏 一.算法目录合集 1.地址 2.说明 二.题目说明 1.题干 2.原地址 三.实现步骤 1.思路分析 1.1.分析问题 1.2.具体步骤 ① 特殊情况分析 ② 常规分析 ...

  4. 力扣 -- 174. 地下城游戏

    题目链接:174. 地下城游戏 - 力扣(LeetCode) 下面是用动态规划的思想解决这道题的过程,相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴. 参考代码: class Solution { ...

  5. 力扣174.地下城游戏

    题目:biubiu 题意:一个矩阵,需要从左上的点到达右下的最后一点,只能往右或往下走,每个矩阵都有一个权值,要求在到达这个矩阵的时候,生命值必须大于0,问初始值最小. 到达矩阵的某个点时我们要求他的 ...

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

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

  7. LeetCode55跳跃游戏//力扣55跳跃游戏(贪心)

    LeetCode55跳跃游戏//力扣55跳跃游戏(贪心) 来源:力扣(LeetCode) 链接:题目跳转 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 . 数组中的每个元素代表你在该 ...

  8. Python贪吃蛇小游戏_完整源码免费分享

    文章目录 Python 贪吃蛇小游戏 1. 导包 2. 配置初始化参数 3. 主函数及运行主体 4. 画食物的函数 5. 画贪吃蛇的函数 6. 画网格的函数(非必选,觉得多余的可以忽略此项) 7. 操 ...

  9. 汉诺塔游戏规律,让汉诺塔沦为体力劳动!(后附汉诺塔解法Python源码)

    记住这个规律,以后玩汉诺塔基本上就是体力劳动了. 规律: 先小后大,单左双右,循环. 设3个柱子分别是甲,乙,丙,把3根柱子看成一个循环,也就是说,甲的右边是乙,乙的右边是丙,而丙的右边则回到甲,同理 ...

最新文章

  1. Unity优化手机游戏学习教程
  2. 中山市交通集团热备容灾项目成功案例
  3. springboot 应用中静态资源下载
  4. 基于Java语言构建区块链(五)—— 地址(钱包)
  5. C语言多文件编译链接为1个可执行文件的简单原理
  6. java aspose 导出word_使用aspose.word 第三方的插件实现导出word
  7. 我真的是前端公众号 NO.1 ?
  8. Mybatisの常见面试题
  9. 做点RouteOS方面的备忘,关于流量监控限速的
  10. 词汇的理解 —— 英译汉
  11. N9(Meego系统)删除自带软件方法------笔者亲测,可行,无副作用
  12. c语言编程GetTickCount,c语言计算时间方法---clock-GetTickCount-QueryPerformanceCounter
  13. 验证身份证的所在地址和前6位号码
  14. 仪表盘故障图像识别_一目了然:汽车仪表盘上指示、警示、故障图标全解
  15. 学习:通用软件滤波算法-前序
  16. html5标签参考手册
  17. WGS84 与 北京54 坐标系互转
  18. 如果编程语言是一门武功绝学
  19. Android数据库大批量数据插入优化
  20. µC/OS-II Release Notes

热门文章

  1. css3动画工具_您应该收藏的10个CSS3动画工具
  2. 映美相机、Qt、Vs、OpenCV
  3. 欧盟宣布建立COVID-19数据共享平台以对抗新冠病毒
  4. 2010年GDC会议记录之六
  5. 最新Thinkphp七彩苍穹影/视源码+免授权的/内附教程
  6. 列宁格勒—诺夫哥罗德战役
  7. 华为设备配置远程登录(ssh)
  8. web 网页调试工具 browser-sync 在 Windows 上安装
  9. canvas水波纹效果_如何使用HTML5 canvas创建水波纹效果
  10. 软件测试面试有那么难吗?这些面试题你能回答出几个