leetcode174

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

 

posted @ 2017-04-20 13:30  淡定的大树懒  阅读(123)  评论(0)    收藏  举报