思路
逆向思维。
cpp
class Solution {
public:
int calculateMinimumHP(vector<vector<int>>& dungeon) {
// 逆向思维。
// 这就是,我要进行的是
int n = dungeon.size();
int m = dungeon[0].size();
vector<vector<int>> dp(n, vector<int>(m, 0));
dp[n-1][m-1] = 0;
for(int i = n-1;i>=0;i--){
for(int j = m-1;j>=0;j--){
if(i == n-1 and j == m-1){
dp[i][j] = max(1,1-dungeon[i][j]);
}else if(i == n-1){
dp[i][j] = max(1,dp[i][j+1]-dungeon[i][j]);
}else if(j == m-1){
dp[i][j] = max(1, dp[i+1][j]-dungeon[i][j]);
}else{
dp[i][j] = max(min(dp[i+1][j], dp[i][j+1])-dungeon[i][j], 1);
}
}
}
return dp[0][0];
}
};