動態規劃 矩陣連乘的問題

2021-06-29 03:05:34 字數 1532 閱讀 9619

《問題的引出》

看下面乙個例子,計算三個矩陣連乘;維數分別為10*100 , 100*5 , 5*50

按此順序計算需要的次數((a1*a2)*a3):10x100x5+10x5x50=7500次

按此順序計算需要的次數(a1*(a2*a3)):10x5x50+10x100x50=75000次

所以問題是:如何確定運算順序,可以使計算量達到最小化。

列舉顯然不可,如果列舉的話,相當於乙個「完全加括號問題」,次數為卡特蘭數,卡特蘭數指數增長,必然不行。

《建立遞迴關係》

子問題狀態的建模(很關鍵):令m[i][j]表示第i個矩陣至第j個矩陣這段的最優解。

顯然如果i=j,則m[i][j]這段中就乙個矩陣,需要計算的次數為0;

如果i>j,則m[i][j]=min,其中k,在i與j之間遊蕩,所以i<=k**實現時需要注意的問題:計算順序!!!

因為你要保證在計算m[i][j]查詢m[i][k]和m[k+1][j]的時候,m[i][k]和m[k+1][j]已經計算出來了。

觀察座標的關係如圖:

所以計算順序如上右圖:相應的計算順序對應**為13-15行

m[1][n]即為最終求解,最終的輸出想為((a1(a2 a3))((a4 a5)a6))的形式,不過沒有成功,待思考...

1

#include

<

iostream

>

2using

namespace

std;

3const

intmax

=100;4

//p用來記錄矩陣的行列,main函式中有說明5//

m[i][j]用來記錄第i個矩陣至第j個矩陣的最優解6//

s用來記錄從**斷開的才可得到該最優解

7int

p[max+1

],m[max][max],s[max][max];

8int

n;//

矩陣個數910

void

matrixchain()28}

29}30}

3132

//根據s記錄的各個子段的最優解,將其輸出

33void

traceback(

inti,

intj)

4041

intmain()

47//

輸入:6 30 35 15 5 10 20 25

48matrixchain();

4950

traceback(

1,n);

51//

最終解值為m[1][n];

52cout

<

][n]

<<

endl;

53return0;

54}

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

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