動態規劃 矩陣連乘問題

2021-10-10 01:58:42 字數 987 閱讀 3446

給定n個矩陣 ,其中ai與ai+1是可乘的。考察這n個矩陣連乘積a1a2a3…an

#include

void

matrixmultiply

(int

** a,

int*

* b,

int*

* c,

int ra,

int ca,

int rb,

int cb)

}}

由三個迴圈可知,兩矩陣相乘共需計算 p * q * r 此數乘

為方便後續計算,令矩陣 ai 的維度為 pi-1*pi

將矩陣連乘積a1a2a3…an簡記為a[i:j],假設最優解在ak和ak+1之間斷開,則總計算量為a[1:k]的計算量加上a[k+1,n]的計算量,再加上兩者相乘的計算量。

a[1:k]和a[k+1:n]的最優解也是同樣的問題,是動態規劃問題的體現。

設 a[i:j] 的最少此數乘為m[i][j] ,則原問題的最優解為m[1][n]。

當i==j時,單一矩陣,無需計算,m=0;

當ivoid

martixchain

(int

* p,

int n,

int*

* m,

int*

* s)}}

}}由於過程中許多子串行多次計算,因此用陣列s記錄子串行的最優解,並採取從下向上(長度r從2到n)的方式來減少重複計算

void

traceback

(int i,

int j,

int*

* s)

從記錄最優解位子的s陣列可知,a[1:n]最優的加括號的位置為(a[1:s[1][n]])(a[s[1][n]+1][n]),以此類推

不斷呼叫traceback,計算出最有計算次序。

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

一.矩陣鏈事例 矩陣鏈問題主要涉及的時在多個矩陣相乘,如何通過相乘的順序來減少程式執行。二.例題分析 這次分析過程按照動態規劃的三個基本條件來逐步解答 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 ...