This commit is contained in:
krahets
2023-08-21 19:32:37 +08:00
parent 02ac0aa9fe
commit fb9ace3a95
62 changed files with 291 additions and 254 deletions
+8 -6
View File
@@ -35,7 +35,7 @@ $$
<p align="center"> 图:初始状态 </p>
我们发现**如果此时将长板 $j$ 向短板 $i$ 靠近,则容量一定变小**。这是因为在移动长板 $j$ 后:
如下图所示**此时将长板 $j$ 向短板 $i$ 靠近,则容量一定变小**。这是因为在移动长板 $j$ 后:
- 宽度 $j-i$ 肯定变小。
- 高度由短板决定,因此高度只可能不变( $i$ 仍为短板)或变小(移动后的 $j$ 成为短板)。
@@ -44,13 +44,15 @@ $$
<p align="center"> 图:向内移动长板后的状态 </p>
反向思考,**我们只有向内收缩短板 $i$ ,才有可能使容量变大**。因为虽然宽度一定变小,**但高度可能会变大**(移动后的短板 $i$ 可能会变长)。
反向思考,**我们只有向内收缩短板 $i$ ,才有可能使容量变大**。因为虽然宽度一定变小,**但高度可能会变大**(移动后的短板 $i$ 可能会变长)。例如在下图中,移动短板后面积变大。
![向内移动板后的状态](max_capacity_problem.assets/max_capacity_moving_short_board.png)
![向内移动板后的状态](max_capacity_problem.assets/max_capacity_moving_short_board.png)
<p align="center"> 图:向内移动板后的状态 </p>
<p align="center"> 图:向内移动板后的状态 </p>
由此便可推出本题的贪心策略:
由此便可推出本题的贪心策略:初始化两指针分裂容器两端,每轮向内收缩短板对应的指针,直至两指针相遇。
下图展示了贪心策略的执行过程。
1. 初始状态下,指针 $i$ , $j$ 分列与数组两端。
2. 计算当前状态的容量 $cap[i, j]$ ,并更新最大容量。
@@ -299,7 +301,7 @@ $$
之所以贪心比穷举更快,是因为每轮的贪心选择都会“跳过”一些状态。
比如在状态 $cap[i, j]$ 下,$i$ 为短板、$j$ 为长板。若贪心地将短板 $i$ 向内移动一格,会导致下状态被“跳过”。**这意味着之后无法验证这些状态的容量大小**。
比如在状态 $cap[i, j]$ 下,$i$ 为短板、$j$ 为长板。若贪心地将短板 $i$ 向内移动一格,会导致下图所示的状态被“跳过”。**这意味着之后无法验证这些状态的容量大小**。
$$
cap[i, i+1], cap[i, i+2], \dots, cap[i, j-2], cap[i, j-1]