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]; } };