建议先看这个题 这个题 这个题,再看这个题。

dfs

显然可以dfs,但是我们就不看了,因为大概率会超时。

动态规划

由于问题问初始的血量最低是多少,dp问题一般是最后一个状态作为输出值,所以对应的,应当从终点往起点迭代,最后输出dp[0][0]

其实状态转移方程改变不算大,但是规则比较的tricky,因为战士血量到0就死掉了,无法行动。所以在dp更新状态时要额外判断。

思路:
由于是从终点倒推起点,则dungeon的值实际应当在动态规划的时候反过来用,也就是原先减血的格子cost变成了buff,是给加血的;原先是加血的格子变成了减血的。
明白规则:在进入负值的格子的时候,战士血量在走出去时要>=1。
明白规则:在进入正值的格子的前,战士血量要至少1,而不是负值。

规则翻译到逆序倒推上:
若是此格子是正值

用M(i,j)代表在能成功踏过坐标i j格子的前提下,踏入格子前战士所需的最小血量, r e v e r s e reverse reverse代表加负号后的cost,根据规则,状态转移方程应该是:
s m a l l e r = m i n ( M ( i + 1 , j ) , M ( i , j + 1 ) ) M ( i , j ) = { 1 s m a l l e r + r e v e r s e i j < = 0 s m a l l e r + r e v e r s e i j else smaller=min(M(i+1,j),M(i,j+1))\\ M(i,j)= \begin{cases} 1 & smaller+reverse_{ij}<=0\\ smaller+reverse_{ij} &\text{else} \end{cases} smaller=min(M(i+1,j),M(i,j+1))M(i,j)={1smaller+reverseij​​smaller+reverseij​<=0else​
稍微解释下, s m a l l e r smaller smaller就是右侧和下侧那个方向上的血量更少。
case 分析:

  • 当血量经过 r e v e r s e reverse reverse后变成了负数或者0,则此格子原先是加血的,则战士最少只需血量1,活着到达这个格子,也就是dp[i][j]=1,而不是血量是负数/零的时候到达(正向看 这个血量已经挂了)。
  • 当血量经过 r e v e r s e reverse reverse后变成了正数,则此格子原先是减血的,则战士需要踏入格子前值变多才能蹚过这个格子,并且血量至少要变多 r e v e r s e i j reverse_{ij} reverseij​,也就是dp[i][j]=smaller+reverse[i][j]

代码:
pos_d是上文中的 r e v e r s e reverse reverse,dungeon是 c o s t cost cost,dp是 M M M。

class Solution:def calculateMinimumHP(self, dungeon: List[List[int]]) -> int:pos_d=[[-num for num in num_l] for num_l in dungeon]dp=[[0 for _ in pos_d[0]] for _ in pos_d]# print(pos_d)# 初始化i_max=len(pos_d)-1j_max=len(pos_d[0])-1dp[-1][-1]=pos_d[-1][-1]+1 if dungeon[-1][-1]<0 else 1# 从下往上初始化for i in range(i_max)[::-1]:# print(i)# print('dp[i+1][j_max]',dp[i+1][j_max],'pos_d[i][j_max]',pos_d[i][j_max])# print('dp[i+1][j_max]+pos_d[i][j_max]',dp[i+1][j_max]+pos_d[i][j_max])if dp[i+1][j_max]+pos_d[i][j_max]<=0:dp[i][j_max]=1else:dp[i][j_max]=dp[i+1][j_max]+pos_d[i][j_max]# 从右往左初始化for j in range(j_max)[::-1]:if dp[i_max][j+1]+pos_d[i_max][j]<=0:dp[i_max][j]=1else:dp[i_max][j]=dp[i_max][j+1]+pos_d[i_max][j]# print(dp)for i in range(i_max)[::-1]:for j in range(j_max)[::-1]:miner=min(dp[i+1][j],dp[i][j+1])if miner+pos_d[i][j]<=0:dp[i][j]=1else:dp[i][j]=miner+pos_d[i][j]# print(dp)return dp[0][0] # if dp[0][0]!=0 else 1

一共提交了3次,
第一次被dp[0][0]==0的时候错了。
第二次是在迭代更新dp的时候战士血量得大于0,我写成了等于0的时候也能走路了,错了。
第三次就AC了。

解题用时

60min,思路10分钟,debug50min, 惨。

【普通人题解】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. [力扣题解] 174. 地下城游戏 DP

    一.题目详情 原题链接:174. 地下城游戏 一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿 ...

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

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

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

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

  7. LeetCode174——地下城游戏

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

  8. LeetCode174. 地下城游戏

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

  9. 174. 地下城游戏(Dungeon Game)

    174. 地下城游戏(Dungeon Game) 题解 动态规划 复杂度分析 Python Java(待完成) 题解 动态规划 dp[i][j]dp[i][j]dp[i][j]表示到达房间dungeo ...

最新文章

  1. php常见排序算去,PHP兑现常见排序算法
  2. 【活动】人工智能产学研生态建设研讨会报名
  3. 网页、网站规划与设计1
  4. 最短编辑距离 python_最短编辑距离算法实现
  5. 【逆天的算法】这几首宋词,你能看出来是出自计算机之手吗?
  6. 非常强悍的 RabbitMQ 总结,写得真好
  7. Vallog可以识别的错误及错误提示
  8. mysql的concat函数_MySQL中concat函数(连接字符串)
  9. JavaWeb的web.xml标签元素(一)
  10. 都是❤️两层循环❤️的冒泡排序,选择排序,插入排序该怎么区分
  11. A股开盘:深证区块链50指数涨0.02%,仁东控股跌停
  12. vue分页组件重置到首页问题
  13. 微信小程序 java运动健身课程打卡系统uniapp
  14. data-bi(3):大数据分析软件 CBoard有了一个另外的ui,vuejs写的
  15. 无广告的免费视频存储空间并提供视频上传转码的功能,很不错的哦
  16. python中文居中对齐处理
  17. 服务器里微信怎么多开,谈谈微信多开
  18. oracle+cascade=gt;true,mysql数据库主外键级联删除脚本RESTRICT -- CASCADE
  19. Bloom Filter 布隆过滤器
  20. 网站签到时Cookie的获取方法

热门文章

  1. ybt 神(bian)奇(tai)题目总结合集(下)
  2. 伪造金融机构经营许可证罪的判刑标准
  3. 定位数据集中有问题的图片位置
  4. “时间花在哪里,结果就在哪里” | 技术人金句系列
  5. excel求和遇到异常值(#DIV/0!、#N/A等)的两种处理办法
  6. 漫谈反问题及一些题外话
  7. 量化噪声的大小与什么成正比_量化噪声.PPT
  8. DTCC 2020 | 阿里云朱洁:NoSQL最新技术发展趋势
  9. java中的反射原理,为什么要使用反射以及反射使用场景(面试常问)
  10. 华为手机计算机撩妹,华为“撩妹黑科技”被三星偷学:Galaxy S10拥有反向无线充电功能...