問題描述(詳見演算法導論p197-p198):
已知:給定n個矩陣構成的乙個矩陣鏈(a1, a2, ..., an),矩陣ai的維數為pi-1×pi
求:決定該矩陣鏈的乘法結合順序(即加括號),使得矩陣鏈乘法的執行時間最短
幾個前提概念
首先判斷是否具有最優子結構假設ai...aj的矩陣鏈乘法的最優解是在ak與ak+1之間分開的,即(ai...ak)(ak+1...aj),則子串行也必須是矩陣鏈乘法的最優解
由此可知,問題的最優解包含子問題的最優解,滿足最優子結構
然後給出遞迴表示式
遞迴表示式如下
其中矩陣ai的維數為pi-1 x pi
然後進行自底向上的求解
矩陣m是乙個上三角矩陣(不需要考慮i>j的情況),且對角線上的元素值均為0
由上面的遞迴表示式知,m[i, j]的值只取決於m[i, k]和m[k+1, j](k≥i且k<j),因此自底向上的求解過程實際是按子串行的長度遞增來進行的
最後構造最優解
在推導過程中記錄s[i, j]的值,用於遞迴構造最優解(即矩陣鏈的圓括號新增順序)
**:
int ** dp(int * p, int n)
for(int l = 2; l <= n; l++)
}} }
printf("m: %d\n", m[0][n-1]);
return s;
}void print_parens(int ** s, int i, int j, int n)
else
}
矩陣鏈乘法問題 (演算法)
一 概述 以兩個矩陣相乘為例,a1 a2,a1和a2為兩個矩陣,假設a1的行列數是p q,a2的行列數是q r。注意這裡由於是a1乘以a2,所以a1的列數要等於a2的行數,否則無法做矩陣乘法,滿足上述條件的矩陣,我們稱之為 相容 的。那麼對於a1 a2而言,我們需要分別執行p r次對應a1的行元素乘...
矩陣鏈乘法
設m i j 為計算矩陣ai.j所需標量乘法運算次數的最小值。對整個問題計算ai.n的最小代價就是m i,n 使用輔助表是s 1.n,1.n 來記錄計算m i,j 時取得最優代價處k的值。k是裂開的位置。include define n 6 void matrix int p,int m n 1 i...
矩陣鏈乘法
a1,a2.an,n個矩陣,矩陣ai的維數為p i 1 p i 資料矩陣鏈乘法加全部括號,使得計算乘法的次數最少 對矩陣ai,ai 1,其維數分別為p i 1 p i p i p i 1 ai ai 1要執行乘法運算的次數為p i 1 p i p i 1 m i j 為矩陣ai ai 1 aj最少的...