演算法導論 動態規劃之矩陣鏈乘法

2021-07-03 18:21:39 字數 1114 閱讀 9355

原題見pdf204頁

a0a1a2a3a4a5

定義:

a[i]的維數為p[i]×p[i+1]

m[i][j]為重a[i]乘到a[j]標量乘法運算的最小次數。(m[i][j]=0,當i==j時)

加入要求解的是m[0][2],則m[0][2]為m[0][0]+m[1][2]+p[0]p[1]p[3];m[0][1]+m[2][2]+p[0]p[2]p[3]中的最小值。

下面通過乙個**來說明如何借助輔助空間實現更快的求解。

這個**可以看成是二維陣列m,而我們想要求解a0a1a2a3a4a5的最小乘法運算次數就是求m[0][5];

當我們按照前面的遞迴去求解m[0][5]時,其實就是在逐漸的把這個表藍色部分的資料給填完整,在動態求解中有很多的子問題被重複的利用,如果使用遞迴就會重複的求解,所以使用這樣乙個輔助空間來儲存已經求解過的值,再次使用時所消耗的時間代價只是o(1),但是需要耗費o(n^2)的空間來儲存。但其實二維陣列使用到的只是藍色部分。

在求解這個表中的資料時,應當從左至右求解,我個人理解這就是動態規劃裡說的從下至上求解。

下面是c++原始碼:

#include

using namespace std;

const

intlength=6;

void matrixchainorder(int p,int m[length]);

int minnum(int p,int m[length],int i,int j);

int main();

int m[length][length];

for(int i=0;i

matrixchainorder(p,m);

for(int i=0;i}}

}void matrixchainorder(int p,int m[length])

else}}

}int minnum(int p,int m[length],int i,int j)

}return

min;

}

演算法導論 動態規劃之矩陣鏈乘法Python實現

求多個矩陣相乘的最優計算順序,使得計算量最低13 6254 p 30,35,15,5,10,20,25 def matrix chain order p n len p 1 矩陣個數 m 0 for i in range n for j in range n s 0 for i in range n...

動態規劃之矩陣鏈乘法

雖然我們在 動態規劃之鋼條切割 裡面已經介紹過動態規劃的相關知識,這裡還是提一下動態的兩大特徵 1.最優子結構,原問題的解是在子問題的最優解的基礎上建立起來的 2.重疊子問題,即在不斷求解子問題的過程中會產生相同的子問題,而不是一直產生新的子問題 現在我們來看乙個例子,假設有三個矩陣 a1 10,1...

動態規劃之矩陣鏈乘法

給定乙個n個矩陣的序列,我們希望計算它的乘積 a1a2a3.an,我們可以用括號標定計算次序,然後再利用標準的矩陣乘法演算法來計算,由於矩陣乘法滿足結合律,所以任何一種計算順序最後的計算結果都是相同的。完全括號化的矩陣乘積鏈 它是單一矩陣,或者兩個完全括號化的矩陣乘積鏈的積,並且已經外加括號 例如矩...