建立遞迴關係
設計算a[i:j],1<=i<=j<=n,所需的最少數乘次數為m[i][j],則原問題的最優值為m[1][n].
當i=j時,a[i:j]=ai 為單一矩陣,無需計算,因此m[i][j]=0,i=1,2,…,n.
當i< j時,可利用最優子結構性質來計算m[i][j]。 若計算a[i:j]的最優次序在ak和ak+1之間斷開,i<=k< j,則m[i][j]=m[i][k]+m[k+1][j]+pi-1pkpj.由於計算時並不知道斷開點k的位置,所以k還未定。不過k的位置只有j-i個可能,因此,k是這j-i個位置中使計算量達到最小的那個位置。從而m[i][j]可以遞迴的定義為
m[i][j]給出了最優值,即計算a[i:j]所需的最少數乘次數。同時還確定了計算a[i:j]的最優次序中的斷開位置k,也就是說,對於這個k,有
m[i][j] = m[i][k] + m[k+1][j] +pi-1pkpj
計算最優值
遞迴方法
時間複雜度為2的n次方。
遞迴做會有多次重複計算,效率會很低,資料稍大就game over
//矩陣連乘遞迴演算法
public
class matrixchain
return u;//返回計算的最少數乘次數值
}public
static
void
main(string args) ;//矩陣a1a2a3a4a5a6連乘
matrixchain mc = new matrixchain();
system.out.println(mc.d(2, 5));//a2a3a4a5最少數乘次數}}
7125
動態規劃方法
時間複雜度為n的3次方
問題具有最優子結構性質和子問題重疊性質是可用動態規劃演算法求解的基本要素。
最優子結構:當問題的最優解包含了其子問題的最優解,稱該問題具有最優子結構性質。
重疊子問題:在用遞迴演算法自頂向下解此問題時,每次產生的子問題並不總是新問題,有些子問題被反覆計算多次。
//p[i]代表第i個矩陣列數,p[i-1]代表第i個矩陣行數 s[i][j]儲存第i到第j個矩陣連乘最優斷開位置的值
public void matrixchain(int p,int n,int m,int s)}}
}
矩陣連乘 動態規劃 動態規劃解矩陣連乘問題
一.矩陣鏈事例 矩陣鏈問題主要涉及的時在多個矩陣相乘,如何通過相乘的順序來減少程式執行。二.例題分析 這次分析過程按照動態規劃的三個基本條件來逐步解答 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 ...