動態規劃 谷歌雞蛋問題

2021-10-06 04:26:56 字數 1869 閱讀 1122

這是我面試時遇到的乙個問題,後來了解到它是谷歌的一道面試演算法題

問題:已知兩個雞蛋硬度相同,100層樓。雞蛋從f層樓房扔下時,可能會破碎。為找出使雞蛋破碎不破碎的最高樓層f(0擴充套件問題:

m個雞蛋,n層樓房

顯然這是乙個笨辦法,也沒有用上第二個雞蛋,x可能等於100

仔細想想其實這是乙個有序序列中找到特定值的問題,於是我們從50層樓開始拋,但顯然雞蛋只有兩個,如果第一次碎了,它也只能窮舉,x可能等於50,顯然二分的次數有限制。

我們在二分的過程中發現,如果第一次碎了,x的最大可能值將很大,而若沒碎,x的最大可能值將驟減,那麼我們可以想想辦法,第一拋我們選低一點,如何確定這個值呢,我們分治一下,第乙個雞蛋拋十次,第二個雞蛋拋十次,即對100進行開方,於是x的最大可能值將等於19

顯然問題需要x的最小值,我們發現開方的方法還不錯,但是它的第乙個雞蛋在10層碎和100層碎的情況下,x的最大可可能值分別是11和19,仔細想想我們可以盡量拋棄運氣問題,讓它第乙個雞蛋無論在**碎,其x的最大可能值都一樣,那麼我們可以怎麼做呢

假若從10層拋,那麼為了和上次拋碎的情況下的x最大可能值相同,我們選擇19層拋,依次拋。10+9+8+7+6+5+4+3+2+1 = (1+10)*10/2,於是我們就發現了樓層高度為55的最優解x為10,那麼最優解為11的是66...最優解為13的是91,最優解為14的是105。

誒,好像還是不知道100層的最優解,其實想想就清楚了最優解為13的情況下是無法完成100層的求解的,而最優解為14的情況下就可以輕易的通過多種方式完成了。

那麼答案就是14。

其實我們把n層樓房的答案也求了出來,

如果 (1+(x-1))(x-1)/2 < n <= (1+x)x/2,那麼這個x就是我們要求的值了。

那如果雞蛋為m個呢,其實這就變成乙個動態規劃問題了,我們思考一下:

如果雞蛋是三個,樓層為n,怎麼求x,

參考上面的思路,把新加的乙個雞蛋當成第乙個雞蛋,如果這個雞蛋第一次在n層就碎了,這顯然變成了我們之前的問題。那麼只要修改第乙個雞蛋拋的間隔就可以解答這個問題了,顯然這個問題的x-1等於上個問題的x,如果第一次拋的樓層為(1+(x-1))(x-1)/2+1,那麼若沒碎,第二次拋的跨度為(1+((x-1)-1))((x-1)-1)/2+1,那麼更多雞蛋的問題也能求出來了

(至於為什麼是x-1而不是x呢,如果按照現在這個思路,把之前兩個雞蛋變成乙個雞蛋的集合,那麼第一次雞蛋拋在x=14上面碎了,單論第二個雞蛋,其最優顯然是13)

當然上述都是數學辦法,當雞蛋數量繼續增大時,數學公式便可能無法表示了,但思路是可以借鑑的。我們來找通式

因為這裡n是範圍值,所以我們假設雞蛋為m,最優解為x的樓高為f(x,m)

那麼我們發現

f(x,m)=f(x-1,m)+f(x-1,m-1)+1
那麼如果  f(x-1,m)< n <=f(x,m)

就能求到x的值了,使用遞迴實現非常簡單

int f(int x, int m)

然後for迴圈便能知道x為多少了,當n與m無限大時,其與x的關係是指數關係,所以時間複雜度是o(2^n*logn)

時間複雜太高了,我們優化一下。

如果畫一下二叉樹,會發現其類似乙個楊輝三角,行高為x,但是當x當然這樣做有些複雜,我們發現f(x,m)是由上一層的f(x-1,m)與f(x-1,m-1)決定的,那麼這就是乙個經典的揹包問題

// 優化得面目全非了,主要優化了邊界問題,以及將入參修改為n

int f(int n, int m)

// 判斷當前情況的x得出的最大值是否滿足條件

if (result[m-1] >= n)

return x;

preresult = result;

}}

雞蛋掉落問題 動態規劃

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

扔雞蛋 (動態規劃)

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

雞蛋掉落(動態規劃)

問題 力扣演算法面試彙總 你的目標是確切地知道 f 的值是多少。無論 f 的初始值如何,你確定 f 的值的最小移動次數是多少?例子 輸入 k 1,n 2 輸出 2 解釋 雞蛋從 1 樓掉落。如果它碎了,我們肯定知道 f 0 否則,雞蛋從 2 樓掉落。如果它碎了,我們肯定知道 f 1 如果它沒碎,那麼...