LC.174.地下城游戏

​传送门​

思路:考虑 d p dp dp,若从左上角往右下角递推,走到当前 ( i , j ) (i,j) (i,j), d p [ i ] [ j ] dp[i][j] dp[i][j]的值与后面的值的大小有关系,所以考虑从后往前递推,我们只需确定从当前 ( i , j ) (i,j) (i,j)走到终点的最小初始值,而不用考虑路径和的影响。

显然我们设当前 ( i , j ) (i,j) (i,j)的最小初始值为 d p [ i ] [ j ] dp[i][j] dp[i][j],显然 d p [ i ] [ j ] + a [ i ] [ j ] ≥ m i n ( d p [ i + 1 ] [ j ] , d [ i ] [ j + 1 ] ) 而 且 d p [ i ] [ j ] + a [ i ] [ j ] ≥ 1 dp[i][j]+a[i][j]\geq min(dp[i+1][j],d[i][j+1])而且dp[i][j]+a[i][j]\ge1 dp[i][j]+a[i][j]≥min(dp[i+1][j],d[i][j+1])而且dp[i][j]+a[i][j]≥1

所以 d p [ i ] [ j ] = m a x ( m i n ( d p [ i + 1 ] [ j ] , d [ i ] [ j + 1 ] ) , 1 ) dp[i][j]=max(min(dp[i+1][j],d[i][j+1]),1) dp[i][j]=max(min(dp[i+1][j],d[i][j+1]),1)

注意初始化和边界情况,终点的 d p [ i + 1 ] [ j ] , d p [ i ] [ j + 1 ] = 1 dp[i+1][j],dp[i][j+1]=1 dp[i+1][j],dp[i][j+1]=1,其他边界为 I N F INF INF即可。

貌似空间复杂度还可以优化到 O ( n ) O(n) O(n),但是我不会。。

class Solution {
public:
int calculateMinimumHP(vector<vector<int>>& a) {
int n=a.size(),m=a[0].size();
vector<vector<int> >dp(n+1,vector<int>(m+1,INT_MAX));
dp[n-1][m]=dp[n][m-1]=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])-a[i][j],1);
}
return dp[0][0];
}
};