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];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值