点评:这个题是一个经典的动态规划题,符合原问题的最优解可以从子问题的最优解中得出的特点。
#超时
class Solution:
def superEggDrop(self, K: int, N: int) -> int:
#状态表示 当前为K个鸡蛋,N层楼时的最小移动次数
#状态选择 如果鸡蛋碎了,K-1,1~ i-1;如果鸡蛋没碎,K不变,i+1~N
#basecase 0个鸡蛋,需要一层层的测试;0个楼层,直接返回0
memo = {}
def dp(K, N):
if K == 1:return N
if N == 0:return 0
if (K, N) in memo:return memo[(K, N)]
res = float('inf')
for i in range(1, N+1):
res = min(res, max(dp(K-1, i-1), dp(K, N-i))+1)
memo[(K, N)] = res
return res
return dp(K, N)
class Solution:
def superEggDrop(self, K: int, N: int) -> int:
#状态表示 dp[K][m] (题目给出K个鸡蛋,N层楼,让求最坏情况下最少的测试次数m)这里转换成给你K个鸡蛋,测试m次,最坏情况能够测试多少层楼N
#状态选择 dp[K][m] = dp[K-1][m-1](没碎,扔鸡蛋次数-1,楼上的楼层数) + dp[K][m-1](碎了,k-1,扔鸡蛋次数m-1,楼下的楼层数) + 1
#1.无论在哪层楼扔鸡蛋,鸡蛋都有可能碎或者没碎,碎的话就测楼下,没碎的话就测楼上;2.无论是楼上还是楼下,总=楼上+楼下+1(当前)
#basecase
dp = [[0]*(N+1)for i in range(K+1)]
m = 0
while dp[K][m] < N:
m += 1
for k in range(1, K+1):
dp[k][m] = dp[k][m-1]+dp[k-1][m-1]+1
return m