题目链接
题目分析
今天做题翻车了,从左上角往右下走考虑的cases好多,直接没做出来翻车。后来看了评论区才得出下面的答案。。
我们从右下角开始做会比较容易理解了,dp[i][j]代表进入dungeon[i][j]的地方需要的最小生命值。
我们这个最小生命值其实取决于其(右侧和下方的最小生命值)-dungeon[i][j]和1比较的较大值。
和1比较主要是如果这个房间如果是正数,是可以加血的,我们进这个房间只需要最小的生命值即可(题目说最小生命值为1,小于等于0就会立刻死亡)
然后我们只需要对终点和两个编辑情况进行单独判断即可。
代码实现
class Solution {
public int calculateMinimumHP(int[][] dungeon) {
int row=dungeon.length;
int col=dungeon[0].length;
//这个数组表示在i,j位置骑士需要的最小生命值
int[][] dp=new int[row][col];
for(int i=row-1;i>=0;i--){
for(int j=col-1;j>=0;j--){
if(i==row-1&&j==col-1){ //终点的情况
dp[i][j]=Math.max(1, 1-dungeon[i][j]);
}else if(i==row-1){ //最后一行的情况
dp[i][j]=Math.max(1, dp[i][j+1]-dungeon[i][j]);
}else if(j==col-1){ //最后一列的情况
dp[i][j]=Math.max(1, dp[i+1][j]-dungeon[i][j]);
}else{
dp[i][j]=Math.max(1, Math.min(dp[i+1][j],dp[i][j+1])-dungeon[i][j]);
}
}
}
return dp[0][0];
}
}