經典演算法 雞蛋掉落問題

2021-10-11 22:48:29 字數 2692 閱讀 8189

剛好今天身體不太舒服,感冒難受的不行,也沒啥精力去學一些新的東西,就把老東西拾起來稍微拾掇一下,稍微複習一下好了。

首先,我們來看一下經典演算法問題的描述:

對應的leetcode的題目描述為:

這個題目事實上我拿到的第一反應考慮能不能夠直接給出最優求解方案,結果就比較呵呵了,後來也是看了一些解答之後發現這是一道動態規劃的經典題目,於是至少演算法就能夠求解了。

顯然,如果只有乙個雞蛋,那麼有幾層樓就必須做幾次實驗才能夠確保找出臨界層f;而如果只有一層樓,那麼無論手上有多少雞蛋,所需要進行的實驗次數都是一次。

那麼,我們就可以很快速的給出遞推公式如下:

dp[k]

[n]=

min(1+

max(dp[k-1]

[i-1

], dp[k]

[n-i]

)for i in

range(1

, n+1)

)

即是說,考察每一次操作從第i層掉落的情況,如果沒有碎,那麼只需要考察樓上的第n-i層即可;反之,如果碎了,那麼只要考察在k-1個雞蛋的情況下對i-1個樓層需要多少次實驗才能夠確保獲得臨界層。

給出python的**實現如下:

class

solution

:def

supereggdrop

(self, k:

int, n:

int)

->

int:

dp =[[

0for i in

range

(n+1)]

for _ in

range

(k+1)]

for k in

range(1

, k+1)

:for n in

range(1

, n+1)

:if k ==1:

dp[k]

[n]= n

elif n ==1:

dp[k]

[n]=

1else

: dp[k]

[n]=

min(1+

max(dp[k-1]

[i-1

], dp[k]

[n-i]

)for i in

range(1

, n+1)

)return dp[k]

[n]

提交**之後測試了幾個例子,均是正確的,但是在leetcode中進行**評測的時候出現了超時錯誤,畢竟上述**的時間複雜度是o(n

3)

o(n^3)

o(n3

)量級的。

leetcode當中給出了另一種更為優雅的**實現。

首先,他的思路並不像我們前面給出的那樣,是明確地去計算對於每乙個明確的k、n情況下的具體答案,而是求解當有k個蛋時,做n次實驗,最多可以確保確定多少層樓以下的閾值樓層

我們同樣可以給出遞推公式如下:

dp[k]

[n]= dp[k-1]

[n-1]+

1+ dp[k]

[n-1

]

其中,k和之前的定義一致,表示有k個蛋,n表示最多經過n次操作,dp[k][n]表示當有k個蛋時,經過n次操作最多可以確保分別出多少樓以下的閾值樓層。

給出python**實現如下:

class

solution

:def

supereggdrop

(self, k:

int, n:

int)

->

int:

dp =[[

0for _ in

range

(n+1)]

for _ in

range

(k+1)]

for n in

range(1

, n+1)

:for k in

range(1

, k+1)

:if k ==1:

dp[k]

[n]= n

else

: dp[k]

[n]= dp[k-1]

[n-1]+

1+ dp[k]

[n-1

]if dp[k]

[n]>= n:

return n

return

-1

**複雜度從之前的o(n

3)

o(n^3)

o(n3

)退化到o(n

2)

o(n^2)

o(n2

),提交**之後在leetcode當中順利通過。

綜上,這道題我們基本也就說明完畢了。不過,當前的執行效率依然不是最優的,leetcode上面還有一些改進的方案將耗時可以進一步優化,但是思路上是相同的,總體演算法複雜度也同樣是o(n

2)

o(n^2)

o(n2

),就是細節實現上不太相同,為了更好地進行說明,我們還是採用了上述這種寫法,其解釋性更強一點。

如果有讀者對更高效的**感興趣的話,可以自行去leetcode上面去看一下。

雞蛋掉落問題

leetcode 887.雞蛋掉落 include include using namespace std intsupereggdropbs int k,int n 這一段改用二分查詢,而不從1列舉到i int start 1,end i,mid int res int max 可能存在找不到的情...

關於雞蛋掉落問題

運用動態規劃原理,相當於打 public intsupereggdrop int k,int n 當樓層為0時,f為0 for int i 0 i1 i dp 0 i 0 當雞蛋個數為0時,f 0 for int i 0 i1 i dp i 0 0 當乙個雞蛋的時候,f為給的樓層數 for int ...

Daily Practice 雞蛋掉落問題

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