動態規划法(七)雞蛋掉落問題(二)


  上次我們講到,我們的主人公丁丁由於用動態規划法解決了雞蛋掉落問題(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), 歡迎大家關注哦~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM