174.go 710 B

123456789101112131415161718192021222324252627282930
  1. package main
  2. func calculateMinimumHP(dungeon [][]int) int {
  3. m, n := len(dungeon), len(dungeon[0]) // Reverse DP
  4. dp := make([][]int, m)
  5. for i := range dp {
  6. dp[i] = make([]int, n)
  7. }
  8. dp[m-1][n-1] = maxInt(1, 1-dungeon[m-1][n-1])
  9. for i := m - 2; 0 <= i; i-- {
  10. dp[i][n-1] = maxInt(1, dp[i+1][n-1]-dungeon[i][n-1])
  11. }
  12. for j := n - 2; 0 <= j; j-- {
  13. dp[m-1][j] = maxInt(1, dp[m-1][j+1]-dungeon[m-1][j])
  14. }
  15. for i := m - 2; 0 <= i; i-- {
  16. for j := n - 2; 0 <= j; j-- {
  17. need := minInt(dp[i+1][j], dp[i][j+1]) - dungeon[i][j]
  18. dp[i][j] = maxInt(1, need)
  19. }
  20. }
  21. return dp[0][0]
  22. }
  23. // func main() {
  24. // println(calculateMinimumHP([][]int{
  25. // {1, -3, 3},
  26. // {0, -2, 0},
  27. // {-3, -3, -3}}), 3)
  28. // }