動態規劃演算法的思路
動態規劃法即 dynamic programming method (dp),是系統分析中的種常用方法。 動態規劃法是20世紀50年代由貝爾曼(r. bellman) 等人提出的,用來解決多階段決策過程問題的一種最優化方法。多階段決策過程是指把研究問題分成若干個相互聯絡的階段,由每個階段都作出決策,從而使整個過程達到最優化。很多情況下,利用動態規劃法處理問題比線性規劃法更為有效,特別是對於那些離散型問題。
動態規劃法就是分多階段進行決策,其基本思路如下:
根據時空的特點,將複雜的問題劃分為相互聯絡的若干個階段,在選定系統行進方向之後,逆向從終點向始點計算,逐次對每個階段尋找某種決策,使整個過程達到最優,所以又稱為逆序決策過程。
按以下兩個步驟可以設計乙個標準 的動態規劃演算法:
(1)劃分階段
按照問題的時間或空間特徵,把問題分為若千個階段。在此需要注意,這若千個階段定要是有序的或者是可排序的(即無後向性),否則問題就無法用動態規劃求解。
(2)選擇狀態
將問題發展到各個階段時所處於的各種客觀情況用不同的狀態表示出來。當然,狀態的選擇要滿足無後效性。
在現實專案中,會經常遇到不能簡單地分解成幾個子問題的複雜問題,而是分解出一系列的子問題。如果再採用把大問題分解成子問題,並綜合子問題的解匯出大問題的解的方法,那麼求解過程會比較耗時,並日會按問題規模的增大而呈冪數級增加。為了節約重複求相同子問題的時間,引入乙個陣列,不管它們是否對最終解有用,把所有子問題的解存於該陣列中,這就是動態規劃法所採用的基本方法。
求兩字串行的最長公共字元子串行
所謂字串行的子串行,是指從給定字串行中隨意去掉若干個字元後所形成的字串行,這裡的若干可能乙個也不去掉。例如,x=abcbdab, y=bcdb是x的乙個子串行。
我們需要考慮的是,如何將最長公共子串行問題分解成子問題,設a="a0,a1,......am-1", b="b0, b1... bn-1"並z=「z0,z1, .... zk-1」為它們的最長公共子串行。可以證明有以下性質:
(1)如果am-1=bn-1,則zk-1=am-1=bn-1,且「z0,z1....,zk-2"是「a0,a1....,am-2和"b0, b1, ..., bn-2」的乙個最長公共子串行。
(2) 如果am-1!=bn-1,則zk-1!=am-1, 說明「z0,z1....,zk-1"是「a0,a1....,am-2和"b0, b1, ..., bn-1」的乙個最長公共子串行。
(3)如果am-1!=bn-1, 則zk-1!=bn-1, 說明「z0,z1....,zk-1"是「a0,a1....,am-1和"b0, b1, ..., bn-2」的乙個最長公共子串行。
在找a和b的公共子串行,如果由am-1=bn-1,則進一步解決乙個子問題,找「a0,a1......,am-2」和"b0,b1,.......,bn-2"的乙個最長公共子串行;如果am-1!=bn-1,則需要解決兩個子問題,找出"a0,a1,....,am-2"和"b0,b1,......,bn-1"的乙個最長公共子串行和找出"a0,a1,......,am-1"和"b0,b1,......,bn-2"的乙個最長公共子串行,再取兩者中較長者作為a和b的最長公共子串行。
演算法分析:
由於每次呼叫至少向上或向左(或向上向左同時)移動一步,所以最多呼叫(m+n)次就會遇到i=0或j=0的情況,此時開始返回。返回時與遞迴呼叫時方向相反,部署相同,所以演算法時間複雜度為o(m+n)
#include#include#define maxlen 100
void lcslength(char *x,char *y,int m, int n,int c[maxlen],int b[maxlen])
for(j=1;j<=n;j++)
for(i=1;i<=m;i++)
else if(c[i-1][j]>=c[i][j-1])
else
} }}
void printlcs(int b[maxlen],char *x,int i,int j)
if(b[i][j]==0)
else if(b[i][j]==1)
else
}void main()
; char y[maxlen]=;
int b[maxlen][maxlen];
int c[maxlen][maxlen];
int m,n;
m=strlen(x);
n=strlen(y);
lcslength(x,y,m,n,c,b);
printlcs(b,x,m,n);
getchar();
}
動態規劃演算法
一 動態規劃演算法原理 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解 對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來。了不去求解相同的子問題,引入乙個陣列,把所有子問題的解存於該陣列中,這就是動態規劃所採用的基本方法。動態規劃...
動態規劃演算法
動態規劃 通過把原問題分解為相對簡單的子問題來求解複雜問題。動態規劃常常適用於有重疊子問題和最優子結構性質的問題。演算法總體思想 演算法的基本步驟 演算法的基本要素 最優子結構 重疊子問題 備忘錄方法 問題描述 子串行 公共子串行 最長公共子串行 lcs 問題 問題分析 動態規劃求解lcs問題 最長...
動態規劃演算法
動態規劃演算法 2011年03月28日 b 動態規劃演算法 b b 作者 july 二零一零年十二月三十一日 b 本文參考 微軟面試100題系列v0.1版第19 56題 演算法導論 維基百科。ok,咱們先來了解下什麼是動態規劃演算法。動態規劃一般也只能應用於有最優子結構的問題。最優子結構的意思是區域...