-
-
Notifications
You must be signed in to change notification settings - Fork 291
Expand file tree
/
Copy path174.java
More file actions
66 lines (61 loc) · 2.35 KB
/
174.java
File metadata and controls
66 lines (61 loc) · 2.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
__________________________________________________________________________________________________
sample 0 ms submission
class Solution {
public int calculateMinimumHP(int[][] dungeon) {
int m = dungeon.length;
int n = dungeon[0].length;
int[][] dp = new int[m][n];
return f(dungeon, 0, 0, dp);
}
private int f(int[][] dungeon, int i, int j, int[][] dp) {
if (i >= dungeon.length || j >= dungeon[0].length) {
return Integer.MAX_VALUE;
} else if (i == dungeon.length - 1 && j == dungeon[0].length - 1) {
dp[i][j] = Math.max(0, -dungeon[i][j]) + 1;
} else if (dp[i][j] == 0) {
int reqToNext = Math.min(f(dungeon, i + 1, j, dp), f(dungeon, i, j + 1, dp));
dp[i][j] = Math.max(1, reqToNext - dungeon[i][j]);
}
// System.out.println(String.format("[%d, %d]: %d", i, j, dp[i][j]));
return dp[i][j];
}
public int calculateMinimumHP_DP(int[][] dungeon) {
int m = dungeon.length;
int n = dungeon[0].length;
int[][] dp = new int[m][n];
for (int i = m - 1; i >= 0; i--) {
for (int j = n - 1; j >= 0; j--) {
int reqToNext;
if (i == m - 1 && j == n - 1) {
reqToNext = 0;
} else {
int right = j == n - 1 ? Integer.MAX_VALUE : dp[i][j + 1];
int down = i == m - 1 ? Integer.MAX_VALUE : dp[i + 1][j];
reqToNext = Math.min(right, down);
}
dp[i][j] = Math.max(0, reqToNext - dungeon[i][j]);
System.out.println(String.format("[%d, %d]: %d", i, j, dp[i][j]));
}
}
return Math.max(dp[0][0], 0) + 1;
}
}
__________________________________________________________________________________________________
sample 34764 kb submission
class Solution {
public int calculateMinimumHP(int[][] dungeon) {
int n = dungeon.length, m = dungeon[0].length;
int[][] dp = new int[n+1][m+1];
for (int i = 0; i <= n; ++i)
for (int j = 0; j <= m; ++j)
dp[i][j] = Integer.MAX_VALUE;
dp[n][m-1] = dp[n-1][m] = 1;
for (int i = n-1; i >= 0; --i)
for (int j = m-1; j >= 0; --j) {
int need = Math.min(dp[i+1][j], dp[i][j+1]) - dungeon[i][j];
dp[i][j] = need > 0 ? need : 1;
}
return dp[0][0];
}
}
__________________________________________________________________________________________________