LeetCode 174. 地下城游戏

题目链接

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];
    }
}
posted @ 2020-07-12 19:38  ZJPang  阅读(87)  评论(0编辑  收藏  举报