标签:分析 开始 div 最大值 一个 alc 游戏 mat dungeon
分析:逆向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]; } }
标签:分析 开始 div 最大值 一个 alc 游戏 mat dungeon
原文地址:https://www.cnblogs.com/yonezu/p/13288119.html