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];
}
};