解法:动态规划
class Solution {
public:
//自下而上的动态规划
int calculateMinimumHP(vector<vector<int>>& dungeon) {
int m=dungeon[0].size();
int n=dungeon.size();
if(m==0 || n==0) return 0;
//状态:dp[n][m]表示从n,m开始出发的最低初始健康点数
int dp[n][m]={0};
//初始化
dp[n-1][m-1]=max(0,-dungeon[n-1][m-1]);
for(int i=m-2;i>=0;i--)
dp[n-1][i]=max(0,dp[n-1][i+1]-dungeon[n-1][i]);
for(int i=n-2;i>=0;i--)
dp[i][m-1]=max(0,dp[i+1][m-1]-dungeon[i][m-1]);
//递推函数
for(int i=n-2;i>=0;i--){
for(int j=m-2;j>=0;j--){
dp[i][j]=max(0,min(dp[i+1][j],dp[i][j+1])-dungeon[i][j]);
}
}
return dp[0][0]+1; //结果
}
};