動態規劃之矩陣鏈

2021-10-04 07:31:58 字數 1568 閱讀 8679

//矩陣鏈  

//時間複雜度為o(n^3)

/*劃分子問題:

1、確定子問題的邊界: 每乙個子問題就是矩陣鏈的長度,邊界即矩陣鏈長度

2、將問題求解變成多步判斷的過程:找出子問題的最優解即 矩陣鏈中求出最小計算量

定義優化函式:

q=min

設計備忘錄:m[i][j]=q

設計標記函式:s[j][j]=k(k是括號位置)

*/#include

using

namespace std;

const

int int_max=

2147483647

;int

const m=6;

//矩陣個數

void

matrix_chain_order

(int

*p,int length,

int m[

][m]

,int s[

][m])}

}}}void

print_optimal_parens

(int s[

][m]

,int i,

int j)

}int

main()

;//矩陣行列數

int m[m]

[m],s[m]

[m];

//m中儲存矩陣i和j之間最小的計算次數,s記錄矩陣i和j中在哪個地方加括號,兩者均為備忘錄

matrix_chain_order

(p,m,m,s)

; cout<<

"當n=5時最優解為: \n"

<[5];

cout<<

"\n括號化方案為:\n"

;print_optimal_parens

(s,1,5

);return0;

}

#include

using

namespace std;

#define n 6

//六個矩陣

#define int_max 2147483647

int b[n]

[n];

int m[n]=;

/*過程就是從底層出發,

先求出矩陣鏈長度為2時的各個次數,

接著求出長度分別為3、4、5、6時的次數

對於每乙個長度,我們只新增乙個括號

子問題就是矩陣鏈的長度

b[1][5] =min(b[1][k]+b[k+1][5]+...)

*/void

matrixchain()

}}}int

main()

/*void matrixchain()

{ int num;

for(int i=1;i/*void matrixchain()

{ int num;

for(int i=0;i

其實矩陣鏈問題和平面凸多邊形最優三角劃分問題相似,不過求的權函式不是相乘了,而是相加。

動態規劃之矩陣鏈相乘

在看這張之前,最好看看我寫的 動態規劃詳解 裡面都是講理論基礎,我下面的分析都是在此基礎上進展的。問題描述 詳見演算法導論p197 p198 已知 給定n個矩陣構成的乙個矩陣鏈 a1,a2,an 矩陣ai的維數為pi 1 pi 求 決定該矩陣鏈的乘法結合順序 即加括號 使得矩陣鏈乘法的執行時間最短 ...

動態規劃之矩陣鏈乘法

雖然我們在 動態規劃之鋼條切割 裡面已經介紹過動態規劃的相關知識,這裡還是提一下動態的兩大特徵 1.最優子結構,原問題的解是在子問題的最優解的基礎上建立起來的 2.重疊子問題,即在不斷求解子問題的過程中會產生相同的子問題,而不是一直產生新的子問題 現在我們來看乙個例子,假設有三個矩陣 a1 10,1...

動態規劃之矩陣鏈乘法

給定乙個n個矩陣的序列,我們希望計算它的乘積 a1a2a3.an,我們可以用括號標定計算次序,然後再利用標準的矩陣乘法演算法來計算,由於矩陣乘法滿足結合律,所以任何一種計算順序最後的計算結果都是相同的。完全括號化的矩陣乘積鏈 它是單一矩陣,或者兩個完全括號化的矩陣乘積鏈的積,並且已經外加括號 例如矩...