1. 程式人生 > >LeetCode 887:雞蛋掉落[Python實現]

LeetCode 887:雞蛋掉落[Python實現]

你將獲得 K 個雞蛋,並可以使用一棟從 1 到 N 共有 N 層樓的建築。

每個蛋的功能都是一樣的,如果一個蛋碎了,你就不能再把它掉下去。

你知道存在樓層 F ,滿足 0 <= F <= N 任何從高於 F 的樓層落下的雞蛋都會碎,從 F 樓層或比它低的樓層落下的雞蛋都不會破。

每次移動,你可以取一個雞蛋(如果你有完整的雞蛋)並把它從任一樓層 X 扔下(滿足 1 <= X <= N)。

你的目標是確切地知道 F 的值是多少。

無論 F 的初始值如何,你確定 F 的值的最小移動次數是多少?

示例 1:

輸入:K = 1, N = 2
輸出:2
解釋:
雞蛋從 1 樓掉落。如果它碎了,我們肯定知道 F = 0 。
否則,雞蛋從 2 樓掉落。如果它碎了,我們肯定知道 F = 1 。
如果它沒碎,那麼我們肯定知道 F = 2 。
因此,在最壞的情況下我們需要移動 2 次以確定 F 是多少。
示例 2:

輸入:K = 2, N = 6
輸出:3
示例 3:

輸入:K = 3, N = 14
輸出:4

思路

首先找出狀態轉移方程,令二維陣列dp[K][Step], K表示雞蛋個數,Step表示第幾次摔落。dp[i][j] 表示i個雞蛋經過j次摔落最多可以確定多少層樓。顯然j <= N

求d[i][j]

  • 當第j次摔落雞蛋不破,我們可以繼續往上確定dp[i][j - 1]
  • 當第j次摔落雞蛋不破,我們最多隻能確定dp[i - 1][j - 1]

狀態方程 d[i][j] = dp[i - 1][j - 1] + ( dp[i][j - 1] + 1 )

最後的1表示本層

Python程式碼

class Solution:
    def superEggDrop(self, K, N):
        dp = [[0 for _ in range(N + 1)] for _ in range(K + 1)]
        for i in range(1, K + 1):
            for step in range(1, N + 1):
                dp[i][step] = dp[i - 1][step - 1] + (dp[i][step - 1] + 1)
                if
dp[K][step] >= N: return step return 0