1. 程式人生 > >動態規劃法(六)雞蛋掉落問題(二)

動態規劃法(六)雞蛋掉落問題(二)

ots ant tro 自己 自己的 公眾號 微信 TE str

??上次我們講到,我們的主人公丁丁由於用動態規劃法解決了雞蛋掉落問題(egg dropping problem)而獲得了當地科學家的賞識。這不,正當丁丁還沈浸在解決問題的喜悅中,科學家又給丁丁出了一個難題:

假設有n個雞蛋和d次嘗試機會,那麽,最多能探索多少層樓?

這無疑是雞蛋問題的翻版,因為這兩個問題實在太像了。丁丁沒有猶豫,立馬按照之前的想法開始思考:

??用\(f(d, n)\)表示該問題的解。假設從k層樓扔下雞蛋(k足夠大),若雞蛋碎了,則剩下n-1個雞蛋,d-1次嘗試機會,最多能向下探索\(f(d-1, n-1)\)層樓;若雞蛋沒碎,則剩下n個雞蛋,d-1次嘗試機會,最多能向上探索\(f(d-1, n)\)

層樓,於是:
\[f(d, n)=1+f(d-1, n-1)+f(d-1,n).\]
\(g(d, n)=f(d, n+1)-f(d,n)\),則:
\[{\displaystyle {\begin{aligned} g(d, n)&=f(d, n+1)-f(d,n)\ &=[1+f(d-1,n)+f(d-1,n+1)]-[1+f(d-1,n-1)+f(d-1,n)]\&=[f(d-1, n+1)-f(d-1,n)]+[f(d-1,n)-f(d-1,n-1)]\&=g(d-1, n)+g(d-1,n-1)\end{aligned}}} \]
因為\(f(0,n)=f(d,0)=0\)
,對於任意的\(n,d\),且\(f(d,1)=d\),故\(g(0,n)=0, g(d,0)=d.\)因為在組合數學中,有:
\[C_n^{k}=C_{n-1}^k+C_{n-1}^{k-1},\]
因此,由數學歸納法可知:\(g(d,n)=C_{d}^{n+1}.\)\(n+1\geq d\)時,\(C_{d}^{n+1}=0.\)對於\(f(d,n)\),有:
\[{\displaystyle {\begin{aligned} f(d,n)=&[f(d,n)-f(d,n-1)]\+&[f(d,n-1)-f(d,n-2)]\+&\cdots \+&[f(d,1)-f(d,0)] \+&f(d,0). \end{aligned}}} \]

因為\(f(d,0)=0\),因此\(f(d,n)=\sum\limits_{i=1}^{n}C_{d}^{i}, d\geq 1.\)於是,科學家的問題就解決了。
??突然,丁丁又想到了:能不能用這個結果來解決雞蛋掉落問題呢?答案是肯定的,對於給定的\(k=f(d,n)\),只需要對d從1開始算起,得到d,恰好使得\(f(d,n)\geq k,\)則d即可雞蛋掉落問題的解。
??科學家看了丁丁的解答,十分滿意,他終於下定決心招丁丁為自己的助手。不過,丁丁說,他還要去外面的世界再看看,因此,科學家也沒有挽留,但他祝願丁丁好運。
??本文不再給出相關的程序,讀者可以自己實現哦~~
??本文的參考文獻為:https://brilliant.org/wiki/egg-dropping/ 。
註意:本人現已開通兩個微信公眾號: 用Python做數學(微信號為:python_math)以及輕松學會Python爬蟲(微信號為:easy_web_scrape), 歡迎大家關註哦~~

動態規劃法(六)雞蛋掉落問題(二)