- 题目:一个二维数组(矩阵),矩阵的右下方是公主被困的地方,矩阵的左上方是王子营救公主的入口。矩阵每个格子都有一个数字,代表王子通过该格子时需要改变的身高,如果数字为负数,则王子的身高需要减少,如果为整数身高则增加。王子只能往下或者往右两个方向行走,并且王子经过任何格子时身高都需要大于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];
}
};