目录
一、题目
二、分析+代码
方法一:先初始化最后一列和最后一行
class Solution {
public:
int calculateMinimumHP(vector<vector<int>>& dungeon) {
int row = dungeon.size();
int col = dungeon[0].size();
vector<vector<int>>dp(row, vector<int>(col, 0));
dp[row - 1][col - 1] = max(1,1- dungeon[row-1][col - 1]);//初始化最后一个单元格
for (int i = row - 2; i >= 0; --i)//初始化最后一列
{
dp[i][col - 1] = max(1, dp[i + 1][col - 1]- dungeon[i][col - 1]);
}
for (int j = col - 2; j >= 0; --j)//初始化最后一行
{
dp[row - 1][j] = max(1,dp[row - 1][j + 1]- dungeon[row - 1][j]);
}
for (int i = row - 2; i >= 0; --i)
{
for (int j = col - 2; j >= 0; --j)
{
dp[i][j] = min(dp[i][j + 1] - dungeon[i][j], dp[i+1][j] - dungeon[i][j]);
dp[i][j] = max(1, dp[i][j]);
}
}
return dp[0][0];
}
};
方法二:多加一行和一列
class Solution {
public:
int calculateMinimumHP(vector<vector<int>>& dungeon) {
int row = dungeon.size();
int col = dungeon[0].size();
vector<vector<int>>dp(row + 1, vector<int>(col + 1, INT_MAX));
dp[row][col - 1] = dp[row - 1][col] = 1;
for (int i = row - 1; i >= 0; --i)
{
for (int j = col - 1; j >= 0; --j)
{
dp[i][j] = min(dp[i][j + 1] , dp[i + 1][j])-dungeon[i][j];
if (dp[i][j] <= 0)
{
dp[i][j] = 1;
}
}
}
return dp[0][0];
}
};