動態規劃演算法的基本思想 演算法 動態規劃

2021-10-11 23:29:49 字數 2374 閱讀 3897

演算法——動態規劃

首先學習動態規劃,我們先知道什麼是動態規劃?

演算法導論這本書是這樣介紹這個演算法的,動態規劃與分治方法類似,都是通過組合子問題的解來來求解原問題的。再來了解一下什麼是分治方法,以及這兩者之間的差別,分治方法將問題劃分為互不相交的子問題,遞迴的求解子問題,再將它們的解組合起來,求出原問題的解。而動態規劃與之相反,動態規劃應用與子問題重疊的情況,即不同的子問題具有公共的子子問題(子問題的求解是遞迴進行的,將其劃分為更小的子子問題)。在這種情況下,分治方法會做許多不必要的工作,他會反覆求解那些公共子問題。而動態規劃對於每乙個子子問題只求解一次,將其解儲存在乙個**裡面,從而無需每次求解乙個子子問題時都重新計算,避免了不必要的計算工作。

定義:

動態規劃演算法是通過拆分問題,定義問題狀態和狀態之間的關係,使得問題能夠以遞推(或者說分治)的方式去解決。

動態規劃演算法的基本思想與分治法類似,也是將待求解的問題分解為若干個子問題(階段),按順序求解子階段,前一子問題的解,為後一子問題的求解提供了有用的資訊。在求解任一子問題時,列出各種可能的區域性解,通過決策保留那些有可能達到最優的區域性解,丟棄其他區域性解。依次解決各子問題,最後乙個子問題就是初始問題的解。

動態規劃的應用場景:

動態規劃方法一般用來求解最優化問題。這類問題可以有很多可行解,每個解都有乙個值,我們希望找到具有最優值的解,我們稱這樣的解為問題的乙個最優解,而不是最優解,因為可能有多個解都達到最優值。

我們解決動態規劃問題一般分為四步:

1、定義乙個狀態,這是乙個最優解的結構特徵

2、進行狀態遞推,得到遞推公式

3、進行初始化

4、返回結果

一般可以使用遞迴或者遞推的寫法來實現動態規劃,這裡以經典的求解斐波拉契數列為例子。如果沒有學過動態規劃,可能只會用遞迴的方式求解斐波拉契數列。**如下:

long long fab(int n)
事實上,這個遞迴會有很多重複的計算,以下遞迴樹可以直觀地表示。實際其時間複雜度為o(2n),指數級的演算法在數字稍大的時候基本不能用,更何況當問題規模較大時遞迴呼叫系統棧也是非常耗時的。

這裡將動態規劃的遞迴寫法用簡單遞迴的方法對比,比較當n=50時,兩者所消耗的時間。

程式執行結果表示,動態規劃遞迴演算法的時間消耗幾乎為0,而簡單遞迴卻用了一分多鐘。這是因為把已經計算的結果記錄下來,每次遇到需要計算已經計算的子問題時,直接使用上次計算過的結果,這樣就把時間複雜度從o(2n)降到了o(n)。

經典例題——揹包問題

題目描述:

假設山洞裡共有a,b,c,d ,e這5件寶物(不是5種寶物),它們的重量分別是2,2,6,5,4,它們的價值分別是6,3,5,4,6,現在給你個承重為10的揹包, 怎麼裝揹包,可以才能帶走最多的財富。

有編號分別為a,b,c,d,e的五件物品,它們的重量分別是2,2,6,5,4,它們的價值分別是6,3,5,4,6,現在給你個承重為10的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?

首先要明確這張表是至底向上,從左到右生成的。

為了敘述方便,用e2單元格表示e行2列的單元格,這個單元格的意義是用來表示只有物品e時,有個承重為2的揹包,那麼這個揹包的最大價值是0,因為e物品的重量是4,揹包裝不了。

對於d2單元格,表示只有物品e,d時,承重為2的揹包,所能裝入的最大價值,仍然是0,因為物品e,d都不是這個揹包能裝的。

同理,c2=0,b2=3,a2=6。

對於承重為8的揹包,a8=15,是怎麼得出的呢?

根據01揹包的狀態轉換方程,需要考察兩個值,

乙個是f[i-1,j],對於這個例子來說就是b8的值9,另乙個是f[i-1,j-wi]+pi;

在這裡,

f[i-1,j]表示我有乙個承重為8的揹包,當只有物品b,c,d,e四件可選時,這個揹包能裝入的最大價值

f[i-1,j-wi]表示我有乙個承重為6的揹包(等於當前揹包承重減去物品a的重量),當只有物品b,c,d,e四件可選時,這個揹包能裝入的最大價值

f[i-1,j-wi]就是指單元格b6,值為9,pi指的是a物品的價值,即6

由於f[i-1,j-wi]+pi = 9 + 6 = 15 大於f[i-1,j] = 9,所以物品a應該放入承重為8的揹包

動態規劃演算法

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

動態規劃演算法

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

動態規劃演算法

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