174. 地下城游戏
一、题目分析
原题配图
-2(K) | -3 | 3 |
---|---|---|
-5 | -10 | 1 |
10 | 30 | -5(P) |
- 初始值
K
从左上角[0,0]
出发,每次只能选择向下或者向右移动一格 - 当
K
的初始值最少为多少时,能移动到右下角[i - 1, j - 1]
- 每移动一格,就会计算当前的
K
值,K = K + nums[i][j]
- 当
K <= 0
时,则无法继续移动,即初始值K
无法从左上角移动到右下角。 - 注意:
K
从[0,0]
时,也会计算当前的K
值
二、解法一:动态规划
- 定义二维数组
dp[m+1][n+1]
(用Integer.MAX_VALUE
填充)表示下标[i, j]
所需要的最小值
用
Integer.MAX_VALUE
填充的原因是在右边界只会选择下面的元素,在下边界只会选择右面的元素
- 根据规则,可由
dp[i+1][j]
,dp[i][j+1]
推导出dp[i][j]
- 因为是求最小值,选择
dp[i+1][j]
,dp[i][j+1]
中较小者min
,减去dungeon[i][j]
可以得到[i,j]
所需要的步数 - 注意如果
min - dungeon[i][j] < 1
说明dungeon[i,j]
可以使k
值变大且大于后面所需要的最小值,那么[i,j]
仅需要1
即可 - dp方程为:
dp[i][j] = Math.max(Math.min(dp[i + 1][j], dp[i][j + 1]) - dungeon[i][j], 1);
- 让公主
P
右下两个邻居的值为1即dp[m][n - 1] = 1
dp[m - 1][n] = 1
原因是进入P点后,K==1即可。如果P >= 0, dp[mEnd][nEnd] = 1;P < 0, dp[mEnd][nEnd] = 1 - dungeon[i][j]
class Solution {
public int calculateMinimumHP(int[][] dungeon)