本文僅作記錄,並將該文中指代較爲不明確的代碼改寫成Python代碼:
對層樓丟個雞蛋,複雜度
def solution(m, n): # m層n個蛋
dp = [[j for j in range(m+1)] for i in range(n+1)] # dp[i][j] i個蛋n層樓至多測幾次,初始化爲樓層數
for i in range(2, n+1): # 顯然,只有一個蛋時,測試次數就是樓層本身
for j in range(2, m+1): # 顯然,如果是一層,測試次數就是樓層本身(即1)
# 第一次扔第k層 => 沒碎:dp[i][j-k]+1; 碎了:dp[i-1][k-1]+1
dp[i][j] = min(dp[i][j], min([max(dp[i][j-k]+1, dp[i-1][k-1]+1) for k in range(1, j)]))
return dp[n][m]
更好的解法——複雜度:
def solution(m, n): # m層n個蛋
moves, dp = 0, [0] * (n+1) # dp[i] 表示i個雞蛋,利用moves次移動,至多可以檢測幾層樓
while dp[n] < m:
for k in range(n, 0, -1):
# 下一步有k個雞蛋時 => 沒碎:dp[moves-1][k]; 碎了:1+dp[moves-1][k-1]
dp[k] += dp[k-1] + 1 # 即 dp[moves][k] = 1 + dp[moves-1][k-1] + dp[moves-1][k]
moves += 1
return moves