題目描述:
給定n個矩陣{a1,a2,…,an},其中,ai與ai+1是可乘的,(i=1,2 ,…,n-1)。用加括號的方法表示矩陣連乘的次序,不同的計算次序計算量(乘法次數)是不同的,找出一種加括號的方法,使得矩陣連乘的次數最小。
例如:
a1是a(5*10)的方陣;
a2是a(10*100)的方陣;
a3是a(100*2)的方陣;
那麼有兩種加括號的方法:
(a1a2)a3;
2. a1(a2a3);
第一種方法的計算量:5*10*100+5*100*2=6000;
第二種方法的計算量:10*100*2+5*10*2=2100;
可以看出不同計算方法計算量差別很大。
問題分析:
1. 矩陣連乘的條件:第乙個矩陣的列等於第二個矩陣的行,此時兩個矩陣是可乘的;
2. 多個矩陣連乘的結果矩陣,其行列等於第乙個矩陣的行和最後乙個矩陣的列;
3.兩個矩陣相乘的計算量:
例如:a(3*2),b(2*4)
可知總執行次數為:3*2*4=24.
所以矩陣am*n和bn*k的乘法運算次數為:m*n*k;
4.矩陣連乘aiai+1ai+2……aj的最優解問題
假設在第k位置上找到最優解,則問題變成了兩個子問題:(aiai+1……ak),(ak+1……aj)
用m[i][j]表示矩陣連乘的最優值,那麼兩個子問題對應的最優值變成m[i][k],m[k+1][j];
設矩陣am的行數為pm,列數為qm,矩陣是可連乘的,即相鄰矩陣qm=pm+1,所以(aiai+1……ak)可表示為pi * qk,
(ak+1……aj)可表示為pk+1 * qj,qk = pk+1.則兩個矩陣連乘的乘法次數為pi * pk+1 * qj。
5.矩陣連乘最優值遞迴式:
**實現:
#include#includeusing namespace std;
const int size=100;
int p[size];
int m[size][size],s[size][size];
int n;
void matrixchain()
動態規劃之矩陣連乘
以下內容參考 摘抄 演算法設計與分析 王曉東編著,清華大學出版社2003年1月第1版。給定n個矩陣,其中ai與ai 1是可乘的,i 1,2,n 1。考察這n個矩陣的連乘積a1a2 an。由於矩陣乘法滿足結合律,故計算矩陣的連乘積可以有許多不同的計算次序,這種計算次序可以用加括號的方式來確定。若乙個矩...
動態規劃之矩陣連乘
假設矩陣a1 m n a2 n p 則a1 a1 m p 其中它們相乘的次數為 m n p。矩陣連乘 多個矩陣相乘,它滿足結合律,故計算矩陣連乘有許多不同的計算次序,不同的計算次序也會導致計算量 數乘次數 的不同。例如 有三個矩陣a1 10 20,a2 20 40,a3 40 30,則a1 a2 a...
矩陣連乘(動態規劃)
題目描述 給定n個矩陣 a1,a2,an 其中ai與ai 1是可乘的,i 1,2 n 1。如何確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。例如 a1 a2 a3 a4 a5 a6 最後的結果為 a1 a2a3 a4a5 a6 最小的乘次為15125。思路 動態規劃演算...