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...