1. 程式人生 > 實用技巧 >174. 地下城遊戲

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]; } }