python
import math
class Solution:
def superEggDrop(self, k: int, n: int):
'''
dp[k][m] = n
# 当前有 k 个鸡蛋,可以尝试扔 m 次鸡蛋
# 这个状态下,最坏情况下最多能确切测试一栋 n 层的楼
# 比如说 dp[1][7] = 7 表示:
# 现在有 1 个鸡蛋,允许你扔 7 次;
# 这个状态下最多给你 7 层楼,
# 使得你可以确定楼层 F 使得鸡蛋恰好摔不碎
# (一层一层线性探查嘛)
'''
if n == 0:
return 0
if k == 1:
return n
b = math.log(n, 2) + 1
if k >= b:
return int(b)
dp = [[0] * (n+1) for _ in range(k+1)]
m = 0
while dp[k][m] < n:
m += 1
for i in range(1, k+1):
'''
dp[i][m-1]扔一次没碎后的楼层查找范围,为该层的上部分所有楼层
dp[i-1][m-1]扔一次碎了后的楼层查找范围,为该层的下部分所有楼层
'''
dp[i][m] = dp[i][m-1] + dp[i-1][m-1] + 1
return m
时间复杂度和空间复杂度都是O(KN)。