174. 地下城游戏

动态规划

建立一个和迷宫大小相同的二维数组用来表示当前位置出发的起始血量,从结尾开始,最先初始化的是公主所在的房间的起始生命值,然后慢慢向第一个房间扩散,不断的得到各个位置的最优的起始生命值。

最优解: dp[i][j],表示当前位置到结尾最少需要的血量。

转移方程:  hp[y][x]=max(1,min(hp[y+1][x],hp[y][x+1])-d[y][x]), 因为骑士的血量不能≤0,所以用max函数保证最少是1。

边界值: hp[m][n-1]=hp[m-1][n]=1;

返回值: dp[0][0]

class Solution {
public:
    int calculateMinimumHP(vector<vector<int>>& dungeon) {
        const vector<vector<int>>& d=dungeon;
        const int m=d.size();
        const int n=d[0].size();
        
        vector<vector<int>> hp(m+1,vector<int>(n+1,INT_MAX));
        hp[m][n-1]=hp[m-1][n]=1;
        
        for(int y=m-1;y>=0;--y)
            for(int x=n-1;x>=0;--x)
                hp[y][x]=max(1,min(hp[y+1][x],hp[y][x+1])-d[y][x]);
                             return hp[0][0];
    }
}; 

猜你喜欢

转载自www.cnblogs.com/suomeimei/p/10525894.html