1 int calculateMinimumHP(vector<vector<int>>& dungeon) { 2 if (dungeon.size() == 0) 3 return 0; 4 int end_x = dungeon.size() - 1; //行 5 int end_y = dungeon[0].size() - 1; //列 6 vector<vector<int>> dp(dungeon.size(), vector<int>(dungeon[0].size())); 7 if (dungeon[end_x][end_y] < 0) . 8 DP [end_x] [end_y] = - Dungeon [end_x] [end_y]; . 9 the else 10 DP [end_x] [end_y] = 0 ; . 11 for ( int J = end_y- . 1 ; J> = 0 ; --j ) // for each column of the last row are processed 12 is { 13 is DP [end_x] [J] DP = [end_x] [+ J . 1 ] - Dungeon [end_x] [J]; 14 IF (DP [end_x] [J] < 0 ) 15 DP [end_x] [J] = 0 ; 16 } . 17 18 is for (int i = end_x - 1; i >= 0; --i) 19 { 20 dp[i][end_y] = dp[i+1][end_y] - dungeon[i][end_y]; 21 if (dp[i][end_y] < 0) 22 dp[i][end_y] = 0; 23 } 24 for (int i = end_x - 1; i >= 0; --i) 25 { 26 for (int j = end_y - 1; j >= 0; --j) 27 { 28 dp[i][j] = min(dp[i + 1][j], dp[i][j + 1]) - dungeon[i][j]; 29 if (dp[i][j] < 0) 30 dp[i][j] = 0; 31 } 32 } 33 return dp[0][0] + 1; 34 }
Dynamic programming equation
dp[i][j]=max(1,min(dp[i+1][j],dp[i][j+1])-dungeon[i][j]);