123456789101112131415161718192021222324252627282930 |
- package main
- func calculateMinimumHP(dungeon [][]int) int {
- 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() {
- // println(calculateMinimumHP([][]int{
- // {1, -3, 3},
- // {0, -2, 0},
- // {-3, -3, -3}}), 3)
- // }
|