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 else 10 dp[end_x][end_y] = 0; 11 for (int j = end_y-1; j >= 0; --j) //对最后一行的每列进行处理 12 { 13 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 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 }
动态规划方程
dp[i][j]=max(1,min(dp[i+1][j],dp[i][j+1])-dungeon[i][j]);