为了解决这个问题,我们将遵循以下步骤-
r:= dp列,c:= dp列
用于初始化j:= r-2,当j> = 0时,将j减1做-
dp [j,c-1]:= dp [j,c-1]和dp [j,c-1] + dp [j + 1,c-1]的最小值
用于初始化j:= c-2,当j> = 0时,将j减1做-
dp [r-1,j]:= dp [r-1,j]和dp [r – 1,j] + dp [r – 1,j + 1]的最小值
用于初始化i:= r-2,当i> = 0时,将i减1做-
dp [i,j]:= dp [i,j]的最小值,dp [i,j] + dp [i + 1,j]和dp [i,j] + dp [i,j + 1]的最大值
用于初始化j:= c-2,当j> = 0时,将j减1做-
如果dp [0,0] <= 0,那么,
返回| dp [0,0] | +1
返回1
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; typedef long long int lli; lli min(lli a, lli b){ return a <= b ? a : b; } lli max(lli a, lli b){ return a <= b ? b : a; } class Solution { public: int calculateMinimumHP(vector<vector<int>>& dp) { int r = dp.size(); int c = dp[0].size(); for(lli j=r-2;j>=0;j--){ dp[j][c-1] = min(dp[j][c-1], dp[j][c-1]+dp[j+1][c-1]); } for(lli j = c-2;j>=0;j--){ dp[r-1][j] =min(dp[r-1][j], dp[r-1][j]+dp[r-1][j+1]); } for(lli i = r-2;i>=0;i--){ for(lli j = c-2;j>=0;j--){ dp[i][j] = min(dp[i][j],max(dp[i][j]+dp[i+1][j],dp[i][j]+dp[i][j+1])); } } if(dp[0][0] <= 0 )return abs(dp[0][0])+1; return 1; } }; main(){ Solution ob; vector<vector<int>> v = {{-2,-2,3},{-5,-10,1},{10,30,-5}}; cout << (ob.calculateMinimumHP(v)); }
{{-2,-2,3},{-5,-10,1},{10,30,-5}}
输出结果
6