很巧妙的dp方法。
class Solution {
public:
int calculateMinimumHP(vector<vector<int> > &dungeon) {
int ** dp;
dp = new int * [dungeon.size() + 1];
for (int i = 0; i < dungeon.size() + 1; i++) dp[i] = new int[dungeon[0].size() + 1];
for (int i = 0; i < dungeon.size() + 1; i++) for (int j = 0; j < dungeon[0].size() + 1; j++) dp[i][j] = INT_MAX;
dp[dungeon.size() - 1][dungeon[0].size()] = 1;
dp[dungeon.size()][dungeon[0].size() - 1] = 1;
for (int i = dungeon.size() - 1; i >= 0; i--)
for (int j = dungeon[i].size() - 1; j >= 0; j--)
dp[i][j] = getMin(min(dp[i][j + 1], dp[i + 1][j]) - dungeon[i][j]);
return dp[0][0];
}
inline int getMin(int n) {if (n > 0) return n; return 1;}
};