class Solution {
public:
int calculateMinimumHP(vector<vector<int>>& dungeon) {
int n=dungeon.size();
int m=dungeon[0].size();
vector<vector<int> > dp(n+1,vector<int>(m+1,INT_MAX));//dp[i][j]表示在map(i,j)点需要的最小生命值
//对边界进行初始化
dp[n][m-1]=1;
dp[n-1][m]=1;
for(int i=n-1;i>=0;i--)
{
for(int j=m-1;j>=0;j--)
{
int curhp=min(dp[i+1][j],dp[i][j+1])-dungeon[i][j];
//状态转移方程,在i,j点所需的hp,加上dungeon[i][j]的值,就是剩余的值,因为是从终点开始更新,所以已经保证了达到终点的条件,因此dp[i][j]+dungeon[i][j]应该和两侧较小的值相等,即接下来骑士应该从当前点向dp值较小的那一侧移动,这样才能保证递推到起点时,所需的生命值是最小的
dp[i][j]=curhp<=0? 1: curhp;
}
}
return dp[0][0];
}
};