174. Dungeon Game (Hard)
1.問題
找出最快到右下角的方格的途徑, 並使總和為1的話, 請問原點的值應該要多少?

2.想法
Dynamic programming
DP矩陣存的是要到下一步的成本 (至少要多少)
最右下角的DP值為: 1或是(1 - 最右下角方格值) -> 找最大值
成本的算法為下一個方格的DP值 - 目前方格的值, 如果是負數則設為1
如果走到了最下面一排或最左邊一列, 則不需要考慮往其他方向走的可能
如果是其他地方的DP值為: 往下走DP或是往右走DP的最小值
3.程式碼
class Solution {
public:
int calculateMinimumHP(vector<vector<int>>& dungeon) {
if (dungeon.size() == 0 || dungeon[0].size() == 0) {
return 1;
}
int n = dungeon.size();
int m = dungeon[0].size();
vector<vector<int>> dp(n, vector<int>(m, 0));
for(int i = n - 1; i >= 0; i--) {
for(int j = m - 1; j >= 0; j--) {
if ( i == n - 1 && j == m - 1) {
dp[i][j] = max(1, 1 - dungeon[i][j]);
}
else if (i == n - 1) {
dp[i][j] = max(1, dp[i][j + 1] - dungeon[i][j]);
}
else if (j == m - 1) {
dp[i][j] = max(1, dp[i + 1][j] - dungeon[i][j]);
}
else
{
dp[i][j] = min(max(1, dp[i][j + 1] - dungeon[i][j]), max(1, dp[i + 1][j] - dungeon[i][j]));
}
}
}
return dp[0][0];
}
};
4.Performance

Last updated