package com.interview.dynamic; /** * Date 03/21/2016 * @author Tushar Roy * * Minimum life needed for knight to reach princess in 2D matrix. * * Time complexity O(n^2) * Space complexity O(n^2) * * https://leetcode.com/problems/dungeon-game/ */ public class DungeonGame { public int calculateMinimumHP(int[][] dungeon) { if (dungeon.length == 0 || dungeon[0].length == 0) { return 0; } int[][] health = new int[dungeon.length][dungeon[0].length]; int m = dungeon.length - 1; int n = dungeon[0].length - 1; health[m][n] = Math.max(1 - dungeon[m][n] , 1); for (int i = m - 1; i >= 0; i--) { health[i][n] = Math.max(health[i + 1][n] - dungeon[i][n], 1); } for (int i = n - 1; i >= 0; i--) { health[m][i] = Math.max(health[m][i+1] - dungeon[m][i], 1); } for (int i = m - 1; i >= 0; i--) { for (int j = n - 1; j >= 0; j--) { health[i][j] = Math.min(Math.max(health[i + 1][j] - dungeon[i][j], 1), Math.max(health[i][j + 1] - dungeon[i][j], 1)); } } return health[0][0]; } public static void main(String args[]) { DungeonGame dg = new DungeonGame(); int[][] dungeon = {{-2, -3, 3}, {-5, -10, 1}, {10, 30, -30}}; System.out.print(dg.calculateMinimumHP(dungeon)); } }