ZJPaang

题目链接

174. 地下城游戏

题目分析

今天做题翻车了,从左上角往右下走考虑的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];
    }
}

分类:

技术点:

相关文章:

  • 2022-03-13
  • 2022-12-23
  • 2022-12-23
  • 2021-04-21
  • 2021-12-30
  • 2021-09-20
  • 2021-07-30
  • 2021-10-24
猜你喜欢
  • 2022-01-18
  • 2021-05-30
  • 2021-09-24
  • 2021-11-01
  • 2021-10-25
  • 2021-05-14
  • 2021-08-23
相关资源
相似解决方案