leetcode174. 地下城游戏(Python3)

文章目录

  • leetcode174. 地下城游戏
    • 方法:动态规划
      • 思路:
      • 代码:
      • 结果:

leetcode174. 地下城游戏

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

骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。

有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点数)。

为了尽快到达公主,骑士决定每次只向右或向下移动一步。

编写一个函数来计算确保骑士能够拯救到公主所需的最低初始健康点数。

例如,考虑到如下布局的地下城,如果骑士遵循最佳路径 右 -> 右 -> 下 -> 下,则骑士的初始健康点数至少为 7

leetcode174. 地下城游戏(Python3)_第1张图片

说明:

  • 骑士的健康点数没有上限。
  • 任何房间都可能对骑士的健康点数造成威胁,也可能增加骑士的健康点数,包括骑士进入的左上角房间以及公主被监禁的右下角房间。

方法:动态规划

思路:

这道题我刚开始的想法是DFS遍历所有的从左上角到右下角的路径中遇到的最低点数。最后1-min即为答案,但是会超时。

然后我开始思考动态规划的方法,**dp(i,j)为长度为2的数组,dp(i,j,1)表示从左上角到该点的路径中,最低点数最大值,dp(i,j,0)表示相对应的路径和。**从左上角开始进行动态规划,这种情况下,在每个点,我们是选择从上面往下走还是从左边往右走是不确定的;更新dp(i,j)的时候,我们既需要考虑路径和,也需要考虑最低点数;无法得到确定的与dp(i-1,j)和dp(j-1,i)相关的公式。因此这个方法行不通。

我们反过来从右下角开始进行动态规划。我们设dp(i,j)为从点(i,j)到右下角点所需要的最小初始点数。最后答案即为dp(0,0)。

对于任一点(i,j),我们的状态转移方程为:
d p ( i , j ) = m a x ( m i n ( d p ( i + 1 , j ) , d p ( i , j + 1 ) ) − d u n g e o

你可能感兴趣的:(Leetcode做题记录,动态规划,算法,leetcode,python)