地下城游戏

 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]);

猜你喜欢

转载自www.cnblogs.com/zouma/p/11502338.html