動態規劃演算法

2021-09-28 17:43:29 字數 1200 閱讀 7159

動態規劃(dynamic programming)是運籌學的乙個分支,是求解決策過程(decision process)最優化的數學方法。20世紀50年代初美國數學家r.e.bellman等人在研究多階段決策過程(multistep decision process)的優化問題時,提出了著名的最優化原理(principle of optimality),把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解,創立了解決這類過程優化問題的新方法——動態規劃。

動態規劃的基本思想

將原問題劃分為子問題,以自底向上的方式求解問題對所有已經求解的子問題,動態規劃法將子問題的解記錄到**中,求解較大的子問題時,一旦要用到已求解的較小子問題的解,就返回**中已常數時間查詢較小子問題的解並直接使用。

動態規劃法的基本要素

最優子結構性質與子問題重疊性質。

動態規劃法的基本步驟

1)分析問題的最優解性質,刻畫最優解的結構特徵。

2)建立最優值的遞迴定義。

3)以自底向上的方式計算出最優值。

4)構造問題的最優解。

分類與舉例

動態規劃一般可分為線性動規,區域動規,樹形動規,揹包動規四類。

舉例:線性動規:攔截飛彈,合唱隊形,挖地雷,建學校,劍客決鬥等;

區域動規:石子合併, 加分二叉樹,統計單詞個數,炮兵布陣等;

樹形動規:貪吃的九頭龍,二分查詢樹,聚會的歡樂,數字三角形等;

揹包問題:01揹包問題,完全揹包問題,分組揹包問題,二維揹包,裝箱問題,擠牛奶(同濟acm第1132題)等;

應用例項:

最短路徑問題 ,專案管理,網路流優化等;

舉例:最長公共子串行

遞迴定義最優解:

**實現:

public static int lcslength(char x,char y,int b) 

else }}

}return c[m-1][n-1];

}public static void lcs(int i,int j,char x,int b)

else if(b[i][j] == 2)

lcs(i-1,j,x,b);

else

lcs(i,j-1,x,b);

}

動態規劃演算法

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

動態規劃演算法

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

動態規劃演算法

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