leetcode 174 地牢游戏(hard java 动态规划)

leetcode 174 地牢游戏(hard java 动态规划)_第1张图片

leetcode 174 地牢游戏(hard java 动态规划)_第2张图片

 leetcode 174 地牢游戏(hard java 动态规划)_第3张图片

 leetcode 174 地牢游戏(hard java 动态规划)_第4张图片

思路就是

dp[i][j]表示为了达到右下角,至少有多少血量能够在行走过程中至少保持一滴血

要从右下角开始向上推,因为只有在右下角知道最少还剩一滴血,然后向上推,最小血量 

java

class Solution {
    public int calculateMinimumHP(int[][] dungeon) {
        if(dungeon.length==0)
            return 0;
        int row=dungeon.length;
        int column=dungeon[0].length;
        int[][]dp = new int[row][column];
        dp[row-1][column-1]=Math.max(1,1-dungeon[row-1][column-1]);
        //先求右侧边
        for(int i=row-2;i>=0;i--){
            dp[i][column-1]=Math.max(1,dp[i+1][column-1]-dungeon[i][column-1]);
        }
        //求下侧边
        for(int j=column-2;j>=0;j--){
            dp[row-1][j]=Math.max(1,dp[row-1][j+1]-dungeon[row-1][j]);
        }
        //求中间
        for(int i=row-2;i>=0;i--){
            for(int j=column-2;j>=0;j--){
                //只能向左或者向上
                int dp_min=Math.min(dp[i+1][j],dp[i][j+1]);
                dp[i][j]=Math.max(1,dp_min-dungeon[i][j]);
            }
        }
        return dp[0][0];
    }
}

 

你可能感兴趣的:(算法,leetcode)