174 Dungeon Game
class Solution {
public:
int calculateMinimumHP(vector<vector<int> > &dungeon) {
int M = dungeon.size();
int N = dungeon[0].size();
// hp[i][j] represents the min hp needed at position (i, j)
// Add dummy row and column at bottom and right side
vector<vector<int> > hp(M + 1, vector<int>(N + 1, INT_MAX));
hp[M][N - 1] = 1;
hp[M - 1][N] = 1;
for (int i = M - 1; i >= 0; i--) {
for (int j = N - 1; j >= 0; j--) {
int need = min(hp[i + 1][j], hp[i][j + 1]) - dungeon[i][j];
hp[i][j] = need <= 0 ? 1 : need;
}
}
return hp[0][0];
}
};
看完應該會有幾個疑惑,把這幾個疑惑看清楚就會懂這段code了。
問題
- 為什麼計算need是取min(hp[i + 1][j], hp[i][j + 1])?
- 為什麼計算need是要-dungeon[i][j]?
- 為什麼 need <= 0 時,要把hp[i][j]設成1?
答案
- 因為我們想要找出用min hp就能到終點的路,所以往右或往下的兩格中,比較小的那格就是我們想要走的路。
- 舉例來說,因為hp[i][j]跟hp[i][j+1]只差在hp[i][j]多吃到dungeon[i][j],而hp[i][j]就是想要算吃到dungeon[i][j]之前需要到多少的HP,所以自然是要-dungeon[i][j]。
- 因為need<=0表示走到這格的時候,可以吃到+HP的東西,所以need<=0。但因為minHP是1,故只要求走到這格的時候,HP有1即可。