LeetCode 题解工作台
地下城游戏
恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。 有些房…
3
题型
5
代码语言
3
相关题
当前训练重点
困难 · 状态·转移·动态规划
答案摘要
我们定义 表示从 $(i, j)$ 到终点所需的最小初始值,那么 的值可以由 和 得到,即: $$
Interview AiBoxInterview AiBox 实时 AI 助手,陪你讲清 状态·转移·动态规划 题型思路
题目描述
恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。
骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。
有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点数)。
为了尽快解救公主,骑士决定每次只 向右 或 向下 移动一步。
返回确保骑士能够拯救到公主所需的最低初始健康点数。
注意:任何房间都可能对骑士的健康点数造成威胁,也可能增加骑士的健康点数,包括骑士进入的左上角房间以及公主被监禁的右下角房间。
示例 1:
输入:dungeon = [[-2,-3,3],[-5,-10,1],[10,30,-5]] 输出:7 解释:如果骑士遵循最佳路径:右 -> 右 -> 下 -> 下 ,则骑士的初始健康点数至少为 7 。
示例 2:
输入:dungeon = [[0]] 输出:1
提示:
m == dungeon.lengthn == dungeon[i].length1 <= m, n <= 200-1000 <= dungeon[i][j] <= 1000
解题思路
方法一:动态规划
我们定义 表示从 到终点所需的最小初始值,那么 的值可以由 和 得到,即:
初始时 和 都为 ,其他位置的值为最大值。
时间复杂度 ,空间复杂度 。其中 和 分别为地牢的行数和列数。
class Solution:
def calculateMinimumHP(self, dungeon: List[List[int]]) -> int:
m, n = len(dungeon), len(dungeon[0])
dp = [[inf] * (n + 1) for _ in range(m + 1)]
dp[m][n - 1] = dp[m - 1][n] = 1
for i in range(m - 1, -1, -1):
for j in range(n - 1, -1, -1):
dp[i][j] = max(1, min(dp[i + 1][j], dp[i][j + 1]) - dungeon[i][j])
return dp[0][0]
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | complexity is O(m _n) due to visiting each cell once for DP calculation. Space complexity is O(n) if optimizing to a single row, otherwise O(m_ n) for the full DP table. |
| 空间 | Depends on the final approach |
面试官常问的追问
外企场景- question_mark
Expect discussion of reverse DP and minimum health calculations.
- question_mark
Check if candidate optimizes space from O(m*n) to O(n).
- question_mark
Look for correct handling of edge cases with demons and health orbs.
常见陷阱
外企场景- error
Forgetting that health cannot drop below 1 at any cell.
- error
Attempting forward DP from start without reverse reasoning leads to incorrect min health.
- error
Mishandling last row or column calculations and off-by-one errors.
进阶变体
外企场景- arrow_right_alt
Allowing diagonal moves changes the DP recurrence and state transitions.
- arrow_right_alt
Variable health regeneration rates in positive cells introduce different state updates.
- arrow_right_alt
Multiple princesses require multi-target DP or BFS with min health tracking.