C ++中的地下城游戏
为了解决这个问题,我们将遵循以下步骤-
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