4
public int calculateMinimumHP(int[][] dungeon) {5
min = new Integer[dungeon.length][dungeon[0].length];6
int answer = min(0, 0, dungeon);7
return Math.max(answer, 1);10
public int min(int i, int j, int[][] dungeon) {11
if (i > dungeon.length - 1 || j > dungeon[0].length - 1) return 400000;12
if (i == dungeon.length - 1 && j == dungeon[0].length - 1) return -dungeon[i][j] + 1;13
if (min[i][j] == null) {14
int down = min(i + 1, j, dungeon);15
int right = min(i, j + 1, dungeon);16
min[i][j] = Math.min(Math.max(right, 1), Math.max(down, 1)) - dungeon[i][j];