📅  最后修改于: 2023-12-03 15:39:47.181000             🧑  作者: Mango
你有两个鸡蛋,可以用来测试一个 N 层的建筑是否会坍塌。你需要确定这个建筑有多少层,才能保证在最坏的情况下测试出来。
当然,鸡蛋会有碎的可能。比如说,若你测试一个楼层 X,碎了,那么在之后的测试中,你就需要在 X 层以下的每一层测试,因为若再碎,你已经无法保证在最坏的情况下找到确切的楼层了。
假设你至少有一枚鸡蛋是未被摔碎的,请问最少需要测试多少次才能得到结果。
输入: 100 层,2 个鸡蛋
输出: 最坏情况下测试次数是 14 次
这是一道经典的动态规划问题。首先可以画出一个表格来模拟测试的过程:
| 鸡蛋 \ 楼层 | 1 | 2 | 3 | 4 | 5 |...| 100 | |:----------:|:---:|:---:|:---:|:---:|:---:|:-:|:--:| | 1 | 1 | 2 | 3 | 4 | 5 |...| 100 | | 2 | 1 | 2 | 2 | 3 | 3 |...| 14 |
其中,每个格子的数值表示鸡蛋个数和当前测试楼层数下,最多需要测试的次数。例如,当只有一个鸡蛋时,测试 100 层楼最多需要 100 次;当有两个鸡蛋时,我们可以先测试第 14 层,如果碎了,则需要在 1 到 13 层之间进行 13 次测试;如果没碎,则需要在 15 到 100 层之间进行 14 次测试。
这个表格的填充可以使用动态规划来实现,具体过程如下:
def superEggDrop(K: int, N: int) -> int:
dp = [[0] * (N+1) for _ in range(K+1)]
for i in range(1, K+1):
for j in range(1, N+1):
if i == 1:
dp[i][j] = j
else:
dp[i][j] = float('inf')
for k in range(1, j+1):
dp[i][j] = min(dp[i][j], max(dp[i-1][k-1], dp[i][j-k]) + 1)
return dp[K][N]