矩陣鏈問題(動態規劃和遞迴)

2021-10-06 12:23:44 字數 1569 閱讀 8223

1.問題

給定n個矩陣{a1,a2,…,an},其中ai與ai+1是可乘的,i=1,2 ,…,n-1。如何確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。

2.解析

假設在第k位置上找到最優解,那麼問題就變成兩個子問題:(ai,ai+1……ak),(ak+1……aj);

用dp[i][j]表示矩陣連乘的最優值,那麼兩個子問題對應的最優值變成dp[i][k],dp[k+1][j];

設矩陣a的行數為p,列數為q,矩陣是可連乘的,即相鄰矩陣q=p+1,所以(ai,ai+1……ak)可表示為pi * qk;

(ak+1……aj)可表示為pk+1 * **,qk = pk+1.則兩個矩陣連乘的乘法次數為pi * pk+1 * **。

//動態規劃部分

for(

int t =

1; t < n; t++)}

dp[i]

[j]= 最小值;}}

//遞迴輸出部分

void

print

(int l,

int r)

}

4.分析

動態規劃部分時間複雜度:

t(n)=n*(n+1)(n-1)/6;

o(n)=n^3;

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

const

int maxn =

1e3+10;

#define ll long long

int i, j, k;

int n, m, q;

const

int inf =

0x3f3f3f3f

;const

int mod =

1e9+7;

map mp[30]

;int

cmp(

int a,

int b)

int mx[maxn]

, dp[maxn]

[maxn]

, p[maxn]

[maxn]

, a[maxn]

;void

print

(int l,

int r)

}int

main()

//動態規劃

for(

int t =

1; t < n; t++)}

dp[i]

[j]= minn;}}

cout << dp[1]

[n]<< endl;

print(1

, n)

;return0;

}/*310 100

100 5

5 50

*/

動態規劃 矩陣鏈連乘問題

矩陣鏈連乘問題 由於不同的矩陣相乘順序會導致不同的矩陣標量元素相乘的運算元,求設矩陣佇列a1a2a3.an 1an的最小相乘運算元。好吧,先讓我們回顧一下線性代數中矩陣乘法的相關知識 其實看到這個題目時我已經忘了兩個矩陣是怎麼相乘的了,剛好回顧一下 兩個矩陣只有相容才能相乘。即a x b要求a的列數...

動態規劃經典問題 矩陣鏈乘

問題描述 給定n個矩陣,其中ai與ai 1是可乘的,i 1,2,3.n 1.考慮這n個矩陣的乘積。由於矩陣乘法滿足結合律,故計算矩陣的連乘積可以有許多不同的計算機次序。這種計算次序可以用加括號的方式確定。若乙個矩陣鏈乘的計算次序完全確定,這時就說該鏈乘已完全加括號。完全加括號的矩陣鏈乘可遞迴的定義如...

動態規劃 矩陣鏈乘問題分析

一.問題簡述 給定n個矩陣,其中a i 和a i 1 是可乘的,這n個矩陣的連乘積a 1 a 2 a n 由於矩陣的乘法滿足結合律,故計算矩陣的連乘積有許多不同的計算次序,而不同的計算次序,所需要計算的連乘次數也是不同的,求解連乘次數最少的矩陣連乘最優次序。輸入乙個序列p 矩陣a的維數為pi 1 p...