動態規劃(1)

2021-09-27 21:33:24 字數 1356 閱讀 6295

一、動態規劃的基本思想

動態規劃演算法通常用於求解具有某種最優性質的問題。

在這類問題中,可能會有許多可行解。

我們希望找到具有最優值的解。

基本思想是將待求解問題分解成若干個子問題,先求解子問題,然後從這些子問題的解得到原問題的解。

二、動態規劃問題的特徵

動態規劃演算法的有效性依賴於問題本身所具有的兩個重要性質:

最優子結構:

當問題的最優解包含了其子問題的最優解時,稱該問題具有最優子結構性質。

重疊子問題

動態規劃演算法的有效性依賴於問題本身所具有的兩個重要性質:

最優子結構:

重疊子問題:

在用遞迴演算法自頂向下解問題時,每次產生的子問題並不總是新問題,有些子問題被反覆計算多次。動態規劃演算法(自底向上)正是利用了這種子問題的重疊性質,對每乙個子問題只解一次,而後將其解儲存在乙個**中,在以後盡可能多地利用這些子問題的解。

三、設計動態規劃法的步驟

找出最優解的性質,並刻畫其結構特徵;

遞迴地定義最優值(寫出動態規劃方程);

以自底向上的方式計算出最優值;

根據計算最優值時得到的資訊,構造乙個最優解。

步驟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 這個轉移方程即可,並不在乎它具體細節。...