一、動態規劃的基本思想
動態規劃演算法通常用於求解具有某種最優性質的問題。
在這類問題中,可能會有許多可行解。
我們希望找到具有最優值的解。
基本思想是將待求解問題分解成若干個子問題,先求解子問題,然後從這些子問題的解得到原問題的解。
二、動態規劃問題的特徵
動態規劃演算法的有效性依賴於問題本身所具有的兩個重要性質:
最優子結構:
當問題的最優解包含了其子問題的最優解時,稱該問題具有最優子結構性質。
重疊子問題
動態規劃演算法的有效性依賴於問題本身所具有的兩個重要性質:
最優子結構:
重疊子問題:
在用遞迴演算法自頂向下解問題時,每次產生的子問題並不總是新問題,有些子問題被反覆計算多次。動態規劃演算法(自底向上)正是利用了這種子問題的重疊性質,對每乙個子問題只解一次,而後將其解儲存在乙個**中,在以後盡可能多地利用這些子問題的解。
三、設計動態規劃法的步驟
找出最優解的性質,並刻畫其結構特徵;
遞迴地定義最優值(寫出動態規劃方程);
以自底向上的方式計算出最優值;
根據計算最優值時得到的資訊,構造乙個最優解。
步驟1~3是動態規劃演算法的基本步驟。
在只需要求出最優值的情形,步驟4可以省略;
若需要求出問題的乙個最優解,則必須執行步驟4。
五.矩陣連乘問題
設有四個矩陣a,b,c,d,它們的維數分別是:a=50×10,b=10×40,c=40×30,d=30×5
總共有五種完全加括號的方式:
(a((bc)d))
(a(b(cd)))
((ab)(cd))
(((ab)c)d)
((a(bc))d)
將矩陣連乘積aiai+1…aj 簡記為a[i:j], 這裡i≤j;
考察計算a[1:n]的最優計算次序。
設這個計算次序在矩陣ak和ak+1之間將矩陣鏈斷開,1≤k0) return m[i][j];
if (i==j) return 0;
int u = lookupchain(i,i)+lookupchain(i+1,j)+p[i-1]*p[i]*p[j];
s[i][j] = i;
for (int k = i+1; ky[j])
//↖else if (c[i-1][j]>=c[i][j-1])
//↑else //←}}
void lcslength (int m, int n, const char x,char y)//↖
else if (c[i-1][j]>=c[i][j-1] )
//↑else //←}}
void lcs(int i,int j,char x)
動態規劃1
維基百科 動態規劃是一種在數學和 電腦科學 中使用的,用於求解包含 重疊子問題 的最優化 問題的方法。其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。動態規劃的思想是多種演算法的基礎,被廣泛應用於電腦科學和工程領域。比較著名的應用例項有 求解 最短路徑 問題,揹...
動態規劃 1
動態規劃是對最優化問題的一種新的演算法設計方法。由於各種問題的性質不同,確定最優解的條件也互不相同,因而動態規劃的沒計法對不同的問題,有各具特色的表示方式。不存在一種萬能的動態規劃演算法。但是可以通過對若干有代表性的問題的動態規劃演算法進行討論,學會這一設計方法。多階段決策過程最優化問題 動態規劃的...
動態規劃1
首先,動態規劃的最基本要求在於無後效性 即結果態之和之前某態有關,並且對於該之前態我們並不關心它到底是怎麼來的 和n到n 1的跳躍一樣,它也是依賴轉移方程得來。比如0 1揹包 我們只要永遠依賴dp i j max dp i 1 j,dp i 1 j wi vi 這個轉移方程即可,並不在乎它具體細節。...