LeetCode#174. Dungeon Game

  • 题目:一个二维数组(矩阵),矩阵的右下方是公主被困的地方,矩阵的左上方是王子营救公主的入口。矩阵每个格子都有一个数字,代表王子通过该格子时需要改变的身高,如果数字为负数,则王子的身高需要减少,如果为整数身高则增加。王子只能往下或者往右两个方向行走,并且王子经过任何格子时身高都需要大于0.求王子的最小初始身高。
  • 难度:Hard(说实话,这一题没有达到Hard级别)
  • 思路:为了求王子的初始身高,可以从公主所在位置着手,先求得在公主的格子里王子的最小身高应该为多少。然后求出矩阵最下方、最右侧两排格子王子的最小身高。其余的格子王子身高则通过动态规划进行求解 动态方程为 tmp = min(health[i][j+1], health[i+1][j]), health[i][j] = max(1, tmp - dungeon[i][j])
  • 代码:
class Solution {
public:
    int calculateMinimumHP(vector<vector<int>>& dungeon) {
        if(dungeon.empty() || dungeon.size() < 1 || dungeon[0].size() < 1){
            return 0;
        }
        int m = dungeon.size();
        int n = dungeon[0].size();

        vector<vector<int>> health(m, vector<int>(n));
        health[m-1][n-1] = max(0, - dungeon[m-1][n-1]) + 1;

        for (int i = n-2; i >= 0; i--) {
            health[m-1][i] = max(1, health[m-1][i+1] - dungeon[m-1][i]);
        }
        for (int i = m-2; i >= 0; i--) {
            health[i][n-1] = max(1, health[i+1][n-1] - dungeon[i][n-1]);
        }

        for (int i = m-2; i >= 0; i --) {
            for (int j = n-2; j >= 0; j--) {
                int tmp = min(health[i][j+1], health[i+1][j]);
                health[i][j] = max(1, tmp - dungeon[i][j]);
            }
        }
        return health[0][0];
    }
};

猜你喜欢

转载自blog.csdn.net/u012559634/article/details/79810995