動態規劃之矩陣連乘

2021-08-25 08:13:50 字數 1380 閱讀 2819

題目描述:

給定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。思路 動態規劃演算...