**class Solution {
public:
int calculateMinimumHP(vector<vector<int>>& dungeon) {
int M = dungeon.size();
int N = dungeon[0].size();
int dp[M][N];
dp[M-1][N-1] = dungeon[M-1][N-1] > 0 ? 1: -dungeon[M-1][N-1] + 1;
for(int i = M - 1; i >=0 ;i--){
for(int j = N -1; j >=0; j--){
if(i == M -1 && j != N-1){
dp[i][j] = dungeon[i][j] - dp[i][j + 1] >= 0 ? 1 : dp[i][j+1] - dungeon[i][j];
}
else if(j == N-1 && i != M - 1){
dp[i][j] = dungeon[i][j] - dp[i + 1][j] >= 0 ? 1 : dp[i + 1][j] - dungeon[i][j];
}
else if(j!=N-1 && i!=M-1){
dp[i][j] = min(dungeon[i][j] - dp[i][j + 1] >= 0 ? 1 : dp[i][j+1] - dungeon[i][j] , dungeon[i][j] - dp[i + 1][j] >= 0 ? 1 : dp[i + 1][j] - dungeon[i][j]);
}
}
}
return dp[0][0];
}
};**
官方题解,是真的简洁!
class Solution {
public:
int calculateMinimumHP(vector<vector<int>>& dungeon) {
int n = dungeon.size(), m = dungeon[0].size();
vector<vector<int>> dp(n + 1, vector<int>(m + 1, INT_MAX));
dp[n][m - 1] = dp[n - 1][m] = 1;
for (int i = n - 1; i >= 0; --i) {
for (int j = m - 1; j >= 0; --j) {
int minn = min(dp[i + 1][j], dp[i][j + 1]);
dp[i][j] = max(minn - dungeon[i][j], 1);
}
}
return dp[0][0];
}
};