为了解决这个问题,我们将遵循以下步骤-
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