動態規劃入門《二》

2021-07-23 21:29:34 字數 2127 閱讀 3637

國王得知他的兩個手下使用了和他相同的方法去解決交代給他們的問題後,不但沒有認為他的兩個大臣在偷懶,反而很高興,因為他知道,他的大臣必然會找更多的人一起解決這個問題,而更多的人會找更更多的人,這樣他這個聰明的方法就會在不經意間流傳開來,而全國人民都會知道這個聰明的方法是他們偉大的國王想出來的,你說國王能不高興嗎?

但是國王也有一些擔憂,因為他實在不知道這個「工程」要動用到多少人來完成,如果幫助他解決這個問題的人太多的話那麼就太勞民傷財了。「會不會影響到今年的收成呢?」國王在心裡想著這個問題,於是他請來了整個國家裡唯一的兩個數學天才,乙個叫做小天,另乙個叫做小才。

國王問小天:「小天啊,我發覺這個問題有點嚴重,我知道其實這可以簡單的看成乙個組合問題,也就是從十個金礦中選取若干個金礦進行開採,看看哪種組合得到的金子最多,也許用組合方法會更好一些。你能告訴我一共有多少種組合情況嗎?」

「國王陛下,如果用組合方法的話一共要考慮2的10次方種情況,也就是1024種情況。」小天思考了一會回答到。

「嗯……,如果每一種情況我交給乙個人去計算能得到的金子數的話,那我也要1024個人,其實還是挺多的。」國王好像再次感覺到了自己的方法是正確的。

國王心理期待著小才能夠給它乙個更好的答案,問到:「小才啊,那麼你能告訴我用我的那個方法總共需要多少人嗎?其實,我也計算過,好像需要的人數是1+2+4+8+16+32+64+……,畢竟每乙個人的確都需要找另外兩個人來幫助他們……」

不辜負國王的期待,小才微笑著說到:「親愛的國王陛下,其實我們並不需要那麼多人,因為有很多問題其實是相同的,而我們只需要為每乙個不同的問題使用乙個人力便可。」

國王高興的問到:「此話如何講?」

「打個比方,如果有乙個人需要知道1000個人和3個金礦可以開採出多少金子,同時另乙個人也需要知道1000個人和3個金礦可以開採出多少金子的話,那麼他們可以去詢問相同的乙個人,而不用各自找不同的人浪費人力了。」

國王思考著說到:「嗯,很有道理,如果問題是一樣的話那麼就不需要去詢問兩個不同的人了,也就是說乙個不同的問題僅需要乙個人力,那麼一共有多少個不同的問題呢?」

「因為每個問題的人數可以從0取到10000,而金礦數可以從0取到10,所以最多大約有10000 * 10 等於100000個不同的問題。」 小才一邊算著一邊回答。

「什麼?十萬個問題?十萬個人力?」國王有點失望。

「請國王放心,事實上我們需要的人力遠遠小於這個數的,因為不是每乙個問題都會遇到,也許我們僅需要

一、兩百個人力就可以解決這個問題了,這主要和各個金礦所需要的人數有關。」 小才立刻回答到。

故事的最後,自然是國王再一次向他的臣民們證明了他是這個國家裡最聰明的人,現在我們通過故事的第二部分來考慮動態規劃的另外兩個思考點。

思考動態規劃的第五點—-做備忘錄:

正如上面所說的一樣,當我們遇到相同的問題時,我們可以問同乙個人。講的通俗一點就是,我們可以把問題的解放在乙個變數中,如果再次遇到這個問題就直接從變數中獲得答案,因此每乙個問題僅會計算一遍,如果不做備忘的話,動態規劃就沒有任何優勢可言了。

思考動態規劃的第六點—-時間分析:

正如上面所說,如果我們用窮舉的方法,至少需要2^n個常數時間,因為總共有2^n種情況需要考慮,如果在揹包問題中,包的容量為1000,物品數為100,那麼需要考慮2^100種情況,這個數大約為10的30次方。

而如果用動態規劃,最多大概只有1000*100 = 100000個不同的問題,這和10的30次方比起來優勢是很明顯的。而實際情況並不會出現那麼多不同的問題,比如在金礦模型中,如果所有的金礦所需人口都是1000個人,那麼問題總數大約只有100個。

非正式地,我們可以很容易得到動態規劃所需時間,如果共有questioncount個相同的子問題,而每乙個問題需要面對choosecount種選擇時,我們所需時間就為questioncount * choosecount個常數。在金礦模型中,子問題最多有大概people * n 個(其中people是用於開採金礦的總人數,n是金礦的總數),因此questioncount = people * n,而就像國王需要考慮是採用左部下的結果還是採用右部下的結果一樣,每個問題面對兩個選擇,因此choosecount = 2,所以程式執行時間為 t = o(questioncount * choosecount) =o(people * n),別忘了實際上需要的時間小於這個值,根據所遇到的具體情況有所不同。

這就是動態規劃的魔力,它減少了大量的計算,因此我們需要動態規劃!請讀者弄明白後再繼續往下看動態規劃入門《三》。

動態規劃入門

1 用 dp 做的題大多數返回值是int boolean,求max min,不能打亂原來輸入順序。2 動態規劃有兩個重要定義,乙個叫 optimal substructure 另乙個叫 overlap subproblem 各種排序 tree 類問題中,都會用到 divide conquer 的思想...

動態規劃入門

大家可以看看這篇文章dp,哪個更容易理解就看哪個!一 動態規劃的定義 動態規劃程式設計是一種針對於解決最優化問題的一種途徑 一種方法,而不是一種特殊演算法,也就是說它沒有固定的模板。在動態規劃中,每走一步都要看看能不能最優,而且動態規劃最擅長的就是多階段問題!二 動態規劃的基本概和基本模型構成 1....

動態規劃入門

學動態規劃自然要從數字三角形開始起步,那麼我們就先從數字三角形開始。數字三角形題目 有乙個由非負整數組成的三角形,第一行只有乙個數,除了最下行之外的每個數的左下方和右下方各有乙個數,如下圖所示 3 24 10 1 4 3 2 20 從第一行的數開始,每次可以往下或往右下走一格,直到走到最下行,把沿途...