問題**:力扣演算法面試彙總
你的目標是確切地知道 f 的值是多少。無論 f 的初始值如何,你確定 f 的值的最小移動次數是多少?
例子:
輸入:k = 1, n = 2
輸出:2
解釋:雞蛋從 1 樓掉落。如果它碎了,我們肯定知道 f = 0 。
否則,雞蛋從 2 樓掉落。如果它碎了,我們肯定知道 f = 1 。
如果它沒碎,那麼我們肯定知道 f = 2 。
因此,在最壞的情況下我們需要移動 2 次以確定 f 是多少。
以下分析內容主要參考題解中@labuladong的解答。# 輸入
k =1
n =2
分析:一般這種帶有生活場景的題目,都是要用動態規劃。
解釋:上面我們確定了問題,接下來用動態規劃來解決。對於動態規劃,我們要確定兩點,即問題的狀態和選擇。
這樣,我們初步的動態規劃框架為
這個時候,在第x層樓上扔雞蛋的結果如何表示?在第x層樓上扔雞蛋,# 當前狀態為k個雞蛋,n層樓
# 返回這個狀態下最優結果
defdp
(k, n)
:int res
for1<=x<=n:
res =
min(res, 在第x層樓上扔雞蛋的結果)
return res
所以我們的程式為
接下來,遞迴的base case為# 當前狀態為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
我們新增乙個備忘錄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 的值是多少。無...