package com.fishercoder.solutions; import com.fishercoder.common.utils.CommonUtils; public class _174 { public static class Solution1 { /** * This problem should fill the dp matrix from bottom right. */ public int calculateMinimumHP(int[][] dungeon) { if (dungeon == null || dungeon.length == 0) { return 0; } int height = dungeon.length; int width = dungeon[0].length; int[][] dp = new int[height][width]; dp[height - 1][width - 1] = (dungeon[height - 1][width - 1] > 0) ? 1 : 1 - dungeon[height - 1][width - 1]; //fill the last column for (int i = height - 2; i >= 0; i--) { int temp = dp[i + 1][width - 1] - dungeon[i][width - 1]; dp[i][width - 1] = Math.max(1, temp); } //fill the last row for (int j = width - 2; j >= 0; j--) { int temp = dp[height - 1][j + 1] - dungeon[height - 1][j]; dp[height - 1][j] = Math.max(temp, 1); } for (int i = height - 2; i >= 0; i--) { for (int j = width - 2; j >= 0; j--) { int down = Math.max(1, dp[i + 1][j] - dungeon[i][j]); int right = Math.max(1, dp[i][j + 1] - dungeon[i][j]); dp[i][j] = Math.min(down, right); } } CommonUtils.printMatrix(dp); return dp[0][0]; } } }