雞蛋掉落(動態規劃)

2021-10-03 07:39:50 字數 1510 閱讀 3153

問題**:力扣演算法面試彙總

你的目標是確切地知道 f 的值是多少。無論 f 的初始值如何,你確定 f 的值的最小移動次數是多少?

例子

輸入:k = 1, n = 2

輸出:2

解釋:雞蛋從 1 樓掉落。如果它碎了,我們肯定知道 f = 0 。

否則,雞蛋從 2 樓掉落。如果它碎了,我們肯定知道 f = 1 。

如果它沒碎,那麼我們肯定知道 f = 2 。

因此,在最壞的情況下我們需要移動 2 次以確定 f 是多少。

# 輸入

k =1

n =2

以下分析內容主要參考題解中@labuladong的解答。

分析:一般這種帶有生活場景的題目,都是要用動態規劃。

解釋:上面我們確定了問題,接下來用動態規劃來解決。對於動態規劃,我們要確定兩點,即問題的狀態和選擇。

這樣,我們初步的動態規劃框架為

# 當前狀態為k個雞蛋,n層樓

# 返回這個狀態下最優結果

defdp

(k, n)

:int res

for1<=x<=n:

res =

min(res, 在第x層樓上扔雞蛋的結果)

return res

這個時候,在第x層樓上扔雞蛋的結果如何表示?在第x層樓上扔雞蛋,

所以我們的程式為

# 當前狀態為k個雞蛋,n層樓

# 返回這個狀態下最優結果

defdp

(k, n)

:for

1<=x<=n:

res =

min(res,

max(dp(k, n-x)

, dp(k-

1,x-1)

)+1)

return res

接下來,遞迴的base case為

我們新增乙個備忘錄memo以防止重複計算,即

# 當前狀態為k個雞蛋,n層樓

# 返回這個狀態下最優結果

defdp

(k, n)

:if k ==1:

return n

if n ==1:

return

1 memo =

if(k, n)

in memo:

return memo[

(k, n)

] res =

float

('inf'

)for

1<=x<=n:

res =

min(res,

max(dp(k, n-x)

, dp(k-

1,x-1)

)+1)

memo[

(k, n)

]= res

return res

雞蛋掉落問題 動態規劃

leetcode第887題雞蛋掉落 題目描述 思路1 這個題的問題是 如何在最小的移動次數內確定雞蛋可以掉碎的最低樓層?很明顯這是乙個最優化問題,也就是求f k,n 的最小值。既然時求最優解,我們就可以考慮使用動態規劃的方法來解。將情況分為以下幾種 1 樓層數為0或者雞蛋數為0,那最少的移動次數就是...

leetcode 887 雞蛋掉落(動態規劃)

你將獲得 k 個雞蛋,並可以使用一棟從 1 到 n 共有 n 層樓的建築。每個蛋的功能都是一樣的,如果乙個蛋碎了,你就不能再把它掉下去。你知道存在樓層 f 滿足 0 f n 任何從高於 f 的樓層落下的雞蛋都會碎,從 f 樓層或比它低的樓層落下的雞蛋都不會破。你的目標是確切地知道 f 的值是多少。無...

887 雞蛋掉落

你將獲得 k 個雞蛋,並可以使用一棟從 1 到 n 共有 n 層樓的建築。每個蛋的功能都是一樣的,如果乙個蛋碎了,你就不能再把它掉下去。你知道存在樓層 f 滿足 0 f n 任何從高於 f 的樓層落下的雞蛋都會碎,從 f 樓層或比它低的樓層落下的雞蛋都不會破。你的目標是確切地知道 f 的值是多少。無...