Dungeon Game - LeetCode

Dungeon Game - LeetCode

题目
这里写图片描述
这里写图片描述


这又是一道动态规划的题目。
一开始的想法是用一个二维数组记录在(i,j)位置所能剩下的最大生命值,但是这是不对的。
后来想到了另一种方法,从右下角开始推,在(i,j)位置记录所需要的最小生命值。然后往起点推。
在走到最后一格后,只需要剩下一滴血就可以,虽然事实上可能剩下很多血,但是剩一滴血是满足条件的最小血量,这是个必要条件。往回推的时候也是每次都找到一个不死的必要血量,然后只要保持这个必要血量就能够得出在起点所需要的最少血量。

class Solution {
public:
    int calculateMinimumHP(vector<vector<int>>& dungeon) {
        int m = dungeon.size();
        int n = dungeon[0].size();
        vector< vector<int> > a(m+1, vector<int>(n+1,9999));
        a[m][n-1] = 1;
        a[m-1][n] = 1;
        for (int i = m-1; i >= 0; i--) {
            for (int j = n-1; j >= 0; j--) {
                int temp = min(a[i+1][j], a[i][j+1]);
                if (dungeon[i][j] < temp) {
                    a[i][j] = temp-dungeon[i][j];
                } else {
                    a[i][j] = 1;
                }
            }
        }
        return a[0][0];
    }
};

猜你喜欢

转载自blog.csdn.net/sgafpzys/article/details/78648615