原題見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,我們可以用括號標定計算次序,然後再利用標準的矩陣乘法演算法來計算,由於矩陣乘法滿足結合律,所以任何一種計算順序最後的計算結果都是相同的。完全括號化的矩陣乘積鏈 它是單一矩陣,或者兩個完全括號化的矩陣乘積鏈的積,並且已經外加括號 例如矩...