|
@@ -1,9 +1,30 @@
|
|
|
package main
|
|
|
|
|
|
func calculateMinimumHP(dungeon [][]int) int {
|
|
|
- return 0
|
|
|
+ m, n := len(dungeon), len(dungeon[0]) // Reverse DP
|
|
|
+ dp := make([][]int, m)
|
|
|
+ for i := range dp {
|
|
|
+ dp[i] = make([]int, n)
|
|
|
+ }
|
|
|
+ dp[m-1][n-1] = maxInt(1, 1-dungeon[m-1][n-1])
|
|
|
+ for i := m - 2; 0 <= i; i-- {
|
|
|
+ dp[i][n-1] = maxInt(1, dp[i+1][n-1]-dungeon[i][n-1])
|
|
|
+ }
|
|
|
+ for j := n - 2; 0 <= j; j-- {
|
|
|
+ dp[m-1][j] = maxInt(1, dp[m-1][j+1]-dungeon[m-1][j])
|
|
|
+ }
|
|
|
+ for i := m - 2; 0 <= i; i-- {
|
|
|
+ for j := n - 2; 0 <= j; j-- {
|
|
|
+ need := minInt(dp[i+1][j], dp[i][j+1]) - dungeon[i][j]
|
|
|
+ dp[i][j] = maxInt(1, need)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return dp[0][0]
|
|
|
}
|
|
|
|
|
|
-func main() {
|
|
|
-
|
|
|
-}
|
|
|
+// func main() {
|
|
|
+// println(calculateMinimumHP([][]int{
|
|
|
+// {1, -3, 3},
|
|
|
+// {0, -2, 0},
|
|
|
+// {-3, -3, -3}}), 3)
|
|
|
+// }
|