動態規劃演算法

2022-08-31 21:48:12 字數 1971 閱讀 3368

動態規劃演算法通常用於求解具有某種最優性質的問題)並具有最優子結構(optimal substructure,想想最短路徑演算法)的問題,動態規劃比通常演算法花費更少時間。在這類問題中,可能會有許多可行解。每乙個解都對應於乙個值,我們希望找到具有最優值的解。動態規劃演算法與分治法類似,其基本思想也是將待求解問題分解成若干個子問題,先求解子問題,然後從這些子問題的解得到原問題的解。與分治法不同的是,適合於用動態規劃求解的問題,經分解得到子問題往往不是互相獨立的。若用分治法來解這類問題,則分解得到的子問題數目太多,有些子問題被重複計算了很多次。如果我們能夠儲存已解決的子問題的答案,而在需要時再找出已求得的答案,這樣就可以避免大量的重複計算,節省時間。我們可以用乙個表來記錄所有已解的子問題的答案。不管該子問題以後是否被用到,只要它被計算過,就將其結果填入表中。這就是動態規劃法的基本思路。具體的動態規劃演算法多種多樣,但它們具有相同的填**式。

動態規劃的應用十分廣泛,如最大子串行和、最優二叉查詢樹、斐波那契數列等等。

1.  最大子串行和

這裡**兩篇不錯的文章:

最大子串行和問題

動態規劃法-------最大連續子串行和

2.  斐波那契數列

尋找fibonacci序列中第n個數,基於其數學定義的直接實現:

function fib(n)

if n = 0 

return 0

else if n = 1

return 1

return fib(n-1) + fib(n-2)

如果我們呼叫fib(5),將產生一棵對於同一值重複計算多次的呼叫樹:

fib(5)

fib(4) + fib(3)

(fib(3) + fib(2)) + (fib(2) + fib(1))

((fib(2) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1))

(((fib(1) + fib(0)) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1))

特別是,fib(2)計算了3次。在更大規模的例子中,還有更多fib的值被重複計算,將消耗指數級時間。

var m := map(0 → 1, 1 → 1)

function fib(n)

if map m does not contain key n

m[n] := fib(n-1) + fib(n-2)

return m[n]

這一儲存已計算出的數值的技術即被稱為快取,這兒使用的是自頂向下的方法:先將問題劃分為若干子問題,然後計算和儲存值。

自下而上的方法中,我們先計算較小的fib,然後基於其計算更大的fib。這種方法也只花費線性(o(n))時間,因為它包含乙個n-1次的迴圈。然而,這一方法只需要常數(o(1))的空間,相反,自頂向下的方法則需要o(n)的空間來儲存對映關係。

function fib(n)

var previousfib := 0, currentfib := 1

if n = 0 

return 0

else if n = 1

return 1

repeat n-1 times

var newfib := previousfib + currentfib

previousfib := currentfib

currentfib  := newfib

return currentfib

在這兩個例子,我們都只計算fib(2)一次,然後用它來計算fib(3)和fib(4),而不是每次都重新計算。

3. 貨幣找零問題

見:貨幣找零問題

未完待續...

動態規劃演算法

一 動態規劃演算法原理 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解 對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來。了不去求解相同的子問題,引入乙個陣列,把所有子問題的解存於該陣列中,這就是動態規劃所採用的基本方法。動態規劃...

動態規劃演算法

動態規劃 通過把原問題分解為相對簡單的子問題來求解複雜問題。動態規劃常常適用於有重疊子問題和最優子結構性質的問題。演算法總體思想 演算法的基本步驟 演算法的基本要素 最優子結構 重疊子問題 備忘錄方法 問題描述 子串行 公共子串行 最長公共子串行 lcs 問題 問題分析 動態規劃求解lcs問題 最長...

動態規劃演算法

動態規劃演算法的思路 動態規劃法即 dynamic programming method dp 是系統分析中的種常用方法。動態規劃法是20世紀50年代由貝爾曼 r.bellman 等人提出的,用來解決多階段決策過程問題的一種最優化方法。多階段決策過程是指把研究問題分成若干個相互聯絡的階段,由每個階段...