題目描述:
給定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 ...