solution.md 2.9 KB
Newer Older
ToTensor's avatar
ToTensor 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
# 地下城游戏

<style>
table.dungeon, .dungeon th, .dungeon td {
  border:3px solid black;
}

 .dungeon th, .dungeon td {
    text-align: center;
    height: 70px;
    width: 70px;
}
</style>

<p>一些恶魔抓住了公主(<strong>P</strong>)并将她关在了地下城的右下角。地下城是由&nbsp;M x N 个房间组成的二维网格。我们英勇的骑士(<strong>K</strong>)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。</p>

<p>骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。</p>

<p>有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为<em>负整数</em>,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 <em>0</em>),要么包含增加骑士健康点数的魔法球(若房间里的值为<em>正整数</em>,则表示骑士将增加健康点数)。</p>

<p>为了尽快到达公主,骑士决定每次只向右或向下移动一步。</p>

<p>&nbsp;</p>

<p><strong>编写一个函数来计算确保骑士能够拯救到公主所需的最低初始健康点数。</strong></p>

<p>例如,考虑到如下布局的地下城,如果骑士遵循最佳路径 <code>右 -&gt; 右 -&gt; 下 -&gt;</code>,则骑士的初始健康点数至少为 <strong>7</strong></p>

<table class="dungeon">
<tr> 
<td>-2 (K)</td> 
<td>-3</td> 
<td>3</td> 
</tr> 
<tr> 
<td>-5</td> 
<td>-10</td> 
<td>1</td> 
</tr> 
<tr> 
<td>10</td> 
<td>30</td> 
<td>-5 (P)</td> 
</tr> 
</table>
<!---2K   -3  3
-5   -10   1
10 30   5P-->

<p>&nbsp;</p>

<p><strong>说明:</strong></p>

<ul>
	<li>
	<p>骑士的健康点数没有上限。</p>
	</li>
	<li>任何房间都可能对骑士的健康点数造成威胁,也可能增加骑士的健康点数,包括骑士进入的左上角房间以及公主被监禁的右下角房间。</li>
</ul>

## template

```cpp

#include <bits/stdc++.h>
using namespace std;

class Solution
{
public:
    int calculateMinimumHP(vector<vector<int>> &dungeon)
    {
        int row = dungeon.size();
        int col = dungeon[0].size();
        int dp[row][col] = {0};
        dp[row - 1][col - 1] = max(1 - dungeon[row - 1][col - 1], 1);
        for (int i = row - 2; i >= 0; i--)
        {
            dp[i][col - 1] = max(dp[i + 1][col - 1] - dungeon[i][col - 1], 1);
        }
        for (int i = col - 2; i >= 0; i--)
        {
            dp[row - 1][i] = max(dp[row - 1][i + 1] - dungeon[row - 1][i], 1);
        }
        for (int i = row - 2; i >= 0; i--)
        {
            for (int j = col - 2; j >= 0; j--)
            {
                dp[i][j] = max(min(dp[i + 1][j], dp[i][j + 1]) - dungeon[i][j], 1);
            }
        }

        return dp[0][0];
    }
};
```

## 答案

```cpp

```

## 选项

### A

```cpp

```

### B

```cpp

```

### C

```cpp

```