Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 51a4688

Browse files
Update 887.super-egg-drop.md
1 parent e0b10d4 commit 51a4688

File tree

1 file changed

+11
-12
lines changed

1 file changed

+11
-12
lines changed

‎problems/887.super-egg-drop.md

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -54,19 +54,16 @@
5454

5555
这道题乍一看很复杂,我们不妨从几个简单的例子入手,尝试打开思路。
5656

57-
假如有 2 个鸡蛋,6 层楼。 我们应该先从哪层楼开始扔呢?想了一会,没有什么好的办法。我们来考虑使用暴力的手段
57+
为了方便描述,我将 f(i, j) 表示有 i 个鸡蛋, j 层楼,在最坏情况下,最少的次数
5858

59-
![](https://p.ipic.vip/120oh0.jpg)
60-
(图 1. 这种思路是不对的)
59+
假如有 2 个鸡蛋,6 层楼。 我们应该先从哪层楼开始扔呢?想了一会,没有什么好的办法。我们来考虑使用暴力的手段。
6160

6261
既然我不知道先从哪层楼开始扔是最优的,那我就依次模拟从第 1,第 2。。。第 6 层扔。每一层楼丢鸡蛋,都有两种可能,碎或者不碎。由于是最坏的情况,因此我们需要模拟两种情况,并取两种情况中的扔次数的较大值(较大值就是最坏情况)。 然后我们从六种扔法中选择最少次数的即可。
6362

6463
![](https://p.ipic.vip/5vz4r2.jpg)
65-
(图 2. 应该是这样的)
64+
(图1)
6665

67-
而每一次选择从第几层楼扔之后,剩下的问题似乎是一个规模变小的同样问题。嗯哼?递归?
68-
69-
为了方便描述,我将 f(i, j) 表示有 i 个鸡蛋, j 层楼,在最坏情况下,最少的次数。
66+
而每一次选择从第几层楼扔之后,剩下的问题似乎是一个规模变小的同样问题。比如选择从 i 楼扔,如果碎了,我们需要的答案就是 1 + f(k-1, i-1),如果没有碎,需要在找 [i+1, n],这其实等价于在 [1,n-i]中找。我们发现可以将问题转化为规模更小的子问题,因此不难想到递归来解决。
7067

7168
伪代码:
7269

@@ -98,9 +95,9 @@ class Solution:
9895
return ans
9996
```
10097

101-
可是如何这就结束的话,这道题也不能是 hard,而且这道题是公认难度较大的 hard 之一。
98+
可是如何这就结束的话,这道题也不能是 hard,而且这道题是公认难度较大的 hard 之一,肯定不会被这么轻松解决
10299

103-
上面的代码会 TLE,我们尝试使用记忆化递归来试一下,看能不能 AC。
100+
实际上上面的代码会 TLE,我们尝试使用记忆化递归来试一下,看能不能 AC。
104101

105102
```py
106103

@@ -121,19 +118,19 @@ class Solution:
121118
那只好 bottom-up(动态规划)啦。
122119

123120
![](https://p.ipic.vip/gnmqq1.jpg)
124-
(图 3)
121+
(图 2)
125122

126123
我将上面的过程简写成如下形式:
127124

128125
![](https://p.ipic.vip/m4ruew.jpg)
129-
(图 4)
126+
(图 3)
130127

131128
与其递归地进行这个过程,我们可以使用迭代的方式。 相比于上面的递归式,减少了栈开销。然而两者有着很多的相似之处。
132129

133130
如果说递归是用函数调用来模拟所有情况, 那么动态规划就是用表来模拟。我们知道所有的情况,无非就是 N 和 K 的所有组合,我们怎么去枚举 K 和 N 的所有组合? 当然是套两层循环啦!
134131

135132
![](https://p.ipic.vip/o91aox.jpg)
136-
(图 5. 递归 vs 迭代)
133+
(图 4. 递归 vs 迭代)
137134

138135
如上,你将 dp[i][j] 看成 superEggDrop(i, j),是不是和递归是一摸一样?
139136

@@ -177,6 +174,7 @@ class Solution:
177174
总结一下,上面的解题方法思路是:
178175

179176
![](https://p.ipic.vip/ynsszu.jpg)
177+
(图 5)
180178

181179
然而这样还是不能 AC。这正是这道题困难的地方。 **一道题目往往有不止一种状态转移方程,而不同的状态转移方程往往性能是不同的。**
182180

@@ -185,6 +183,7 @@ class Solution:
185183
把思路逆转!
186184

187185
![](https://p.ipic.vip/jtgl7i.jpg)
186+
(图 6)
188187

189188
> 这是《逆转裁判》 中经典的台词, 主角在深处绝境的时候,会突然冒出这句话,从而逆转思维,寻求突破口。
190189

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /