zoukankan      html  css  js  c++  java
  • 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];
        }
    }
  • 相关阅读:
    BNUOJ 12756 Social Holidaying(二分匹配)
    HDU 1114 Piggy-Bank(完全背包)
    HDU 2844 Coins (多重背包)
    HDU 2602 Bone Collector(01背包)
    HDU 1171 Big Event in HDU(01背包)
    HDU 2571 命运 (入门dp)
    HDU 1069 Monkey and Banana(最长递减子序列)
    HDU 1160 FatMouse's Speed (最长上升子序列)
    HDU 2594 KMP
    POJ 3783 Balls --扔鸡蛋问题 经典DP
  • 原文地址:https://www.cnblogs.com/yonezu/p/13288119.html
Copyright © 2011-2022 走看看