矩陣連乘問題(動態規劃演算法)

2022-05-03 04:06:06 字數 1889 閱讀 8793

動態規劃演算法思想簡介:

將乙個問題分解為多個子問題,這點和分治法類似,但是每個子問題不是獨立的而是相互聯絡的,所以我們在求解每個子問題的時候可能需要重複計算到其他的子問題,所以我們將計算過的子問題的解放進乙個表中,這樣就能避免了重複計算帶來的耗費,這就是動態規劃的基本思想;

一般地,動態規劃思想一般用來解最優化問題,主要分為以下四個步驟:

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

(2)遞迴地定義最優值;

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

(4)根據計算得到的最優值時得到的資訊,構造最優解;

同時,問題的最優子結構性質也是該問題可用動態規劃演算法求解的顯著特徵,這裡的最優子結構性質即指:問題的最優解也即代表著它的子問題有了最優解;

問題描述:

具體可參考:

分析過程如下:

(1)分析最優子結構的性質:

(2)分析遞迴關係以及利用自底向上的方式進行計算:

(3)獲取最優值最優解

**如下:

#ifndef matrix_chain_h

#define matrix_chain_h

void matrix_chain(int *p, int n, int **m, int **s);

void traceback(int i, int j, int **s);

#endif

#include #include 

"matrix_chain.h

"using

namespace

std;

//利用動態規劃演算法獲取最優值

void matrix_chain(int *p, int n, int **m, int **s) //

p:各個矩陣的列數,n:矩陣個數,m:m[i:j]矩陣i到j的相乘次數,s:對應的分開位置

for (int r = 2; r <= n; r++)}}

}}//

利用s[i][j]獲取最優解

void traceback(int i, int j, int **s)

#include #include 

"matrix_chain.h

"using

namespace

std;

int main(void

) matrix_chain(p, matrix_num, m, s);

traceback(

0, matrix_num - 1

, s);

system(

"pause");

return1;

}

可結合我的另一篇關於貪心演算法的部落格進行比較,了解這兩者的區別;

矩陣連乘問題動態規劃演算法

內容 n個矩陣連乘,不滿 換律,但是滿足結合律,通過不同的加括號方式,會使得需要的乘法次數不同。用動態規劃方法計算,找出最優加括號方式,使總的乘法次數最少。下面我們考慮用動態規劃求解。預處理 將矩陣連乘積aiai 1 aj簡記為a i j 這裡i j。考察計算a i j 的最優計算次序。設這個計算次...

矩陣連乘的動態規劃演算法

矩陣鏈乘問題 輸入 共兩行 第一行 n 1 n 100 代表矩陣個數。第二行有 n 1 個數,分別為 a1 a2 an 1 1 ak 2000 ak 和 ak 1 代表第 k 個矩陣是個 ak x ak 1 形的。輸出 共兩行 第一行 m 為最優代價。注 測試用例中 m 值保證小於 2 31 第二行...

c 矩陣連乘的動態規劃演算法並輸出 矩陣連乘

問題描述 給定n個矩陣a1,a2,an,其中,ai與aj 1是可乘的,i 1,2,n l。你的任務是要確定矩陣連乘的運算次序,使計算這n個矩陣的連乘積a1a2 an時總的元素乘法次數達到最少。例如 3個矩陣a1,a2,a3,階分別為10 100 100 5 5 50,計算連乘積a1a2a3時按 a1...