题意
题解
首先考虑图论,求顶点 K K K 至顶点 P P P 所有路径上点的路径权值和的最小值的最大值,修改松弛条件跑 S P F A SPFA SPFA 即可。
动态规划可以更简单地求解,如果正向递推,要维护路径权值和,又变为单源最短路问题;考虑逆向递推, d p [ i ] [ j ] dp[i][j] dp[i][j] 代表从 ( i , j ) (i,j) (i,j) 出发到达终点所需的最小初值,则有
d p [ i ] [ j ] = m a x ( m i n ( d p [ i + 1 ] [ j ] , d p [ i ] [ j + 1 ] ) − d u n g e o n [ i ] [ j ] , 1 ) dp[i][j] = max(min(dp[i + 1][j], dp[i][j + 1]) - dungeon[i][j], 1) dp[i][j]=max(min(dp[i+1][j],dp[i][j+1])−dungeon[i][j],1)
class Solution
{
#define inf 0x3f3f3f3f
public:
int calculateMinimumHP(vector<vector<int>> &dungeon)
{
int n = dungeon.size(), m = dungeon[0].size();
vector<vector<int>> dp(n + 1, vector<int>(m + 1, inf));
dp[n][m - 1] = dp[n - 1][m] = 1;
for (int i = n - 1; i >= 0; i--)
{
for (int j = m - 1; j >= 0; j--)
{
dp[i][j] = max(min(dp[i + 1][j], dp[i][j + 1]) - dungeon[i][j], 1);
}
}
return dp[0][0];
}
};