動態規劃 矩陣鏈乘法

 

 

Description

給定n個矩陣{A1,A2,…,An},其中Ai與Ai+1是可乘的,i=1,2 ,…,n-1。如何確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。 

Input

有N個矩陣連乘,用一行有n+1個數數組表示,表示是n個矩陣的行及第n個矩陣的列,它們之間用空格隔開. 

Output

你的輸出應該有C行,即每組測試數據的輸出佔一行,它是計算出的矩陣最少連乘積次數,輸出最優全括號結構

Sample Input

10 100 5 50

 

 

Sample Output

 

7500
((A1A2)A3)

 

 

分析:

 

矩陣鏈乘法問題描述:
 給定由n個矩陣構成的序列[A1,A2,...,An],對乘積A1A2...An,找到最小化乘法次數的加括號方法。
 1)尋找最優子結構
此問題最難的地方在於找到最優子結構。對乘積A1A2...An的任意加括號方法都會將序列在某個地方分成兩部分,也就是最後一次乘法計算的地方,我們將這個位置記爲k,也就是說首先計算A1...Ak和Ak+1...An,然後再將這兩部分的結果相乘。
最優子結構如下:假設A1A2...An的一個最優加括號把乘積在Ak和Ak+1間分開,則前綴子鏈A1...Ak的加括號方式必定爲A1...Ak的一個最優加括號,後綴子鏈同理。
一開始並不知道k的確切位置,需要遍歷所有位置以保證找到合適的k來分割乘積。
 
2)構造遞歸解
設m[i,j]爲矩陣鏈Ai...Aj的最優解的代價,則
          ┌ 0    如果i = j
m[i,j] = │
          └ min(i≤k<j) {m[i,k] + m[k+1,j] + Ai.row*Ak.col*Aj.col}  如果i < j
 
 3)構建輔助表,解決重疊子問題
從第二步的遞歸式可以發現解的過程中會有很多重疊子問題,可以用一個nXn維的輔助表t[n][n]來保存子問題的解,表中每個元素包含2個信息,分別是最優乘積代價及其分割位置k 。
輔助表t[n][n]可以由2種方法構造,一種是自底向上填表構建,該方法要求按照遞增的方式逐步填寫子問題的解,也就是先計算長度爲2的所有矩陣鏈的解,然後計算長度3的矩陣鏈,直到長度n;另一種是自頂向下填表的備忘錄法,該方法將表的每個元素初始化爲某特殊值(本問題中可以將最優乘積代價設置爲一極大值),以表示待計算,在遞歸的過程中逐個填入遇到的子問題的解。
備忘錄法會比自底向上法慢一個常數因子,因爲前者有遞歸調用的代價,維護表格的開銷也稍大。

 

 

 

 

另外一種實現最優矩陣鏈方式函數:

該函數採用自底向上方法進行計算

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章