動態規劃 矩陣連乘問題(二)

2021-08-30 21:45:39 字數 2024 閱讀 6240

話不多說,直接**:

void matrixchain(int *p, int n, int m[maxn], int s[maxn])}}

}

演算法複雜度分析:

演算法matrixchain的主要計算量取決於演算法中對r,

i和k的

3重迴圈。迴圈體內的計算量為

o(1),而3

重迴圈的總次數為

o(n3

)。因此演算法的計算時間上界為

o(n3

)。演算法所占用的空間顯然為

o(n2)。

•演算法matrixchain僅給出矩陣連乘積所需的最少數乘次數, 但未給出具體按什麼次序做矩陣乘法.

•但注意到: matrixchain已記錄了構造乙個最優解所需的全部資訊: 由s[i,j]中的數k知, 計算矩陣鏈a[i,j]的最佳方式應在ak和ak+1之間斷開.

由演算法matrixchain中s[i][j] = k 知,矩陣鏈a[i:j]的最優加括號方式應為(a[i:k])(a[k+1:j])。計算a[1:n]的最優加括號方式為

(a[1: s[1][n]])( a[ s[1][n]+ 1 : n])。

而a[1: s[1][n] ]的最優加括號方式(a[1:s[1][s[1][n]]])(a[s[1][s[1][n]]+1:s[1][n])。……。由此可確定a[1:n]的最優完全加括號方式,即構造出問題的乙個最優解。

p53 演算法traceback計算出斷點矩陣s指示的加括號方式輸出計算a[i][j] 的最優計算次序

void traceback(int i, int j, int s[maxn])

動態規劃演算法的基本要素:

一、最優子結構:

問題的最優解包含著其子問題的最優解,這種性質稱為最優子結構性質

比如:矩陣連乘問題具有最優子結構性質。

分析問題是否具有最優子結構性質:首先假設由問題的最優解匯出的子問題的解不是最優的,然後再設法說明在這個假設下可構造出比原問題最優解更好的解,從而導致矛盾。

利用問題的最優子結構性質,以自底向上的方式遞迴地從子問題的最優解逐步構造出整個問題的最優解

最優子結構是問題能用動態規劃演算法求解的前提。

同乙個問題可以有多種方式刻劃它的最優子結構,有些表示方法的求解速度更快(空間占用小,問題的維度低)

二、重疊子問題

遞迴演算法求解問題時,每次產生的子問題並不總是新問題,有些子問題被反覆計算多次。這種性質稱為子問題的重疊性質

動態規劃演算法對每乙個子問題只解一次,而後將其解儲存在乙個**中,當再次需要解此子問題時,只是簡單地用常數時間檢視一下結果。

通常不同的子問題個數隨問題的大小呈多項式增長

因此用動態規劃演算法只需要多項式時間,從而有較高的解題效率。

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

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