class Solution {
public:
int calculateMinimumHP(vector<vector<int> > &dungeon) {
int n = dungeon.size();
if(n <= 0){
return 0;
}
int m = dungeon[0].size();
if(m <= 0){
return 0;
}
int f[2][m];
f[(n-1) & 1][m - 1] = dungeon[n - 1][m - 1];
for(int j = m - 2; j >= 0; j--){
f[(n-1) & 1][j] = dungeon[n - 1][j] + min(0, f[(n-1) & 1][j + 1]);
}
for(int i = n - 2; i >= 0; i--){
f[i & 1][m - 1] = dungeon[i][m - 1] + min(0, f[i & 1 ^ 1][m - 1]);
for(int j = m - 2; j >= 0; j--){
f[i & 1][j] = dungeon[i][j] + min(0, max(f[i & 1 ^ 1][j],f[i & 1][j + 1]));
}
}
return 1 + (f[0][0] >0 ? 0 : abs(f[0][0]));
}
};
如果允许修改dungeon数组,那么我们甚至可以得到一个O(1)空间的解决方案
class Solution {
public:
int calculateMinimumHP(vector<vector<int> > &dungeon) {
int n = dungeon.size();
if(n <= 0){
return 0;
}
int m = dungeon[0].size();
if(m <= 0){
return 0;
}
for (int i = n - 1; i >= 0; i--) {
for (int j = m - 1; j >= 0; j--) {
bool rowEnd = i == n - 1;
bool columnEnd = j == m - 1;
if (!rowEnd && !columnEnd) {
dungeon[i][j] += max(dungeon[i + 1][j], dungeon[i][j + 1]);
} else if (rowEnd ^ columnEnd) {
dungeon[i][j] += dungeon[i + (rowEnd ? 0 : 1)][j + (columnEnd ? 0 : 1)];
}
dungeon[i][j] *= !(dungeon[i][j] > 0);
}
}
return abs(dungeon[0][0]) + 1;
}
};