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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值