classCalculateMinimumHP:"""
174. 地下城游戏
https://leetcode.cn/problems/dungeon-game/
"""defsolution(self, dungeon: List[List[int]])->int:# 我们想计算左上⻆到右下⻆所需的最⼩⽣命值
m, n =len(dungeon),len(dungeon[0])
self.memo =[[-1for _ inrange(n)]for _ inrange(m)]return self.dp(dungeon,0,0)defdp(self, grid, i, j):"""
从 grid[i][j] 到达终点(右下⻆)所需的最少⽣命值
:param grid:
:param i:
:param j:
:return:
"""
m, n =len(grid),len(grid[0])# base caseif i == m -1and j == n -1:return1if grid[i][j]>=0else-grid[i][j]+1if i == m or j == n:returnfloat('inf')if self.memo[i][j]!=-1:return self.memo[i][j]
res =min(self.dp(grid, i, j+1),
self.dp(grid, i+1, j))- grid[i][j]
self.memo[i][j]=1if res <=0else res
return self.memo[i][j]