174. 地下城游戏

   分析:逆向dp

class Solution {
    public int calculateMinimumHP(int[][] dungeon) {
        if(dungeon.length == 0 || dungeon[0].length == 0) return 0;
        int m = dungeon.length, n = dungeon[0].length;
        int[][] dp = new int[m][n];
        dp[m-1][n-1] = dungeon[m-1][n-1] <= 0 ? -dungeon[m-1][n-1] + 1 : 1;
        for(int i = m - 2; i >= 0; i--) {
            dp[i][n-1] = dp[i+1][n-1] <= dungeon[i][n-1] ? 1 : dp[i+1][n-1] - dungeon[i][n-1]; 
        }
        for(int i = n - 2; i >= 0; i--) {
            dp[m-1][i] = dp[m-1][i+1] <= dungeon[m-1][i] ? 1 : dp[m-1][i+1] - dungeon[m-1][i]; 
        }
        for(int i = m - 2; i >= 0; i--) {
            for(int j = n - 2; j >= 0; j--) {
                dp[i][j] = Math.min(dp[i+1][j],dp[i][j+1]) <= dungeon[i][j] ? 1 : Math.min(dp[i+1][j],dp[i][j+1]) - dungeon[i][j];
            }
        }
        return dp[0][0];
    }
}

  优化空间复杂度

class Solution {
    public int calculateMinimumHP(int[][] dungeon) {
        if(dungeon.length == 0 || dungeon[0].length == 0) return 1;
        int m = dungeon.length, n = dungeon[0].length;
        int[] dp = new int[n+1];
        Arrays.fill(dp,Integer.MAX_VALUE); // 注意 应该初始化为上一个状态的值
                                    //因为dp[i]由上一状态的dp[i]以及本次跟新的dp[i+1]得到
                                // 对于最开始的情况上一状态都应初始化为最大值,本次更新结果才可由dp[i+1]得到
        dp[n-1] = dungeon[m-1][n-1] >= 0 ? 1 : -dungeon[m-1][n-1] + 1;
        for(int i = m-1; i >= 0; i--) {  // 逆向跟新
            for(int j = n-1; j >= 0; j--) {
                if(i == m - 1 && j == n - 1) continue;
                dp[j] = Math.min(dp[j],dp[j+1]) - dungeon[i][j] <= 0 ? 1 : 
                Math.min(dp[j],dp[j+1]) - dungeon[i][j];
            }
        }
        return dp[0];
    }
}
原文地址:https://www.cnblogs.com/yonezu/p/13288119.html