矩陣連乘問題 動態規劃 ACM

2021-09-11 12:10:43 字數 1380 閱讀 9648

題目描述:

給定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 * **,qk = pk+1.則兩個矩陣連乘的乘法次數為pi * pk+1 * **。

5.矩陣連乘最優值遞迴式:

**實現:

#include#includeusing namespace std;

const int size=100;

int p[size];

int m[size][size],s[size][size];

int n;

void matrixchain()

矩陣連乘 動態規劃 動態規劃解矩陣連乘問題

一.矩陣鏈事例 矩陣鏈問題主要涉及的時在多個矩陣相乘,如何通過相乘的順序來減少程式執行。二.例題分析 這次分析過程按照動態規劃的三個基本條件來逐步解答 1 尋找最優子結構 假設我們已經找到父矩陣鏈最優解,當我們劃分到最後一步時都是兩個子矩陣鏈 分別被括號包圍 相乘,如 a1a2a3a4 a5a6a7...

python矩陣連乘 動態規劃 矩陣連乘問題

一 問題描述 給定n個數字矩陣a1,a2,an,其中ai與ai 1是可乘的,設ai是pi 1 pi矩陣,i 1,2,n。求矩陣連乘a1a2.an的加括號方法,使得所用的乘次數最少。例子三個矩陣連乘,可以有 a1a2 a3和a1 a2a3 兩種方法求積 乘法次數分別為 p0p1p2 p0p2p3和p0...

動態規劃 矩陣連乘問題

給定n 1個矩陣 a0,a1,a2,an 1 其中ai與ai 1是可乘的,i 0,1,2,n 2。矩陣乘法滿足結合律。考察這n個矩陣的連乘積,得出運算次數最少的結合。首先,考慮兩個矩陣相乘。如果a b兩個矩陣可以相乘,那麼a b的形式必定滿足 a p q b q r 設c a b,那麼c滿足c p ...