最優矩陣鏈乘 動態規劃

2021-09-28 15:23:14 字數 1032 閱讀 1571

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

解答:我們按照動態規劃的幾個步驟來分析:

(1)找出最優解的性質,刻畫其特徵結構

對於矩陣連乘問題,最優解就是找到一種計算順序,使得計算次數最少。

令m[i][j]表示第i個矩陣至第j個矩陣這段的最優解。

將矩陣連乘積 簡記為a[i:j] ,這裡i<=j.假設這個最優解在第k處斷開,i<=k(2)建立遞迴關係

設計算a[i:j],1≤i≤j≤n,所需要的最少數乘次數m[i,j],則原問題的最優值為m[1,n] 。

當i=j時,a[i,j]=ai, m[i,j]=0;(表示只有乙個矩陣,如a1,沒有和其他矩陣相乘,故乘的次數為0)

當ipkpj} ,其中 i<=k(相當於對i~j這段,把它分成2段,看哪種分法乘的次數最少,如a1,a2,a3,a4,則有3種分法:、、,其中{}表示其內部是最優解,如表示是a1a2a3的最優解),

3)計算最優值

對於1≤i≤j≤n不同的有序對(i,j) 對於不同的子問題,因此不同子問題的個數最多只有o(n*n).但是若採用遞迴求解的話,許多子問題將被重複求解,所以子問題被重複求解,這也是適合用動態規劃法解題的主要特徵之一。

用動態規劃演算法解此問題,可依據其遞迴式以自底向上的方式進行計算。在計算過程中,儲存已解決的子問題答案。每個子問題只計算一次,而在後面需要時只要簡單查一下,從而避免大量的重複計算,最終得到多項式時間的演算法。

下面給出動態規劃求解最優值的**:

//也是要列舉求到的,但是如果我們之前先記錄下這些小規模的情況,當求大規模的時候,直接提取就行了,因此體現了記憶搜尋的說法

void matrixchain(int *p,int n,int **m,int **s)}}

}}//matrixchain

矩陣鏈乘 動態規劃

普通矩陣相乘 define row a 2 define col a 2 define col b 3 void matrix mul int mata row a col a int matb 2 col b int c row a col b 兩個相容矩陣相乘,相容是指矩陣a的行必須等於矩陣b的...

最優矩陣鏈乘

問題描述 乙個n m矩陣由n行m列共n m個數排列而成。兩個矩陣a和b可以相乘當且僅當a的列數等於b的行數。乙個n m的矩陣乘以乙個m p的矩陣等於乙個n p的矩陣,運算量為nmp。矩陣乘法滿足結合律,a b c可以表示成 a b c或者是a b c 兩者的運算量卻不同。例如當a 2 3 b 3 4...

最優矩陣鏈乘

題目大意 乙個n m矩陣由n行m列共n m個數排列而成。兩個矩陣a和b可以相乘當且僅當a的列數等於b的行數。乙個n m的矩陣乘以乙個m p的矩陣等於乙個n p的矩陣,運算量為nmp。矩陣乘法滿足結合律,a b c可以表示成 a b c或者是a b c 兩者的運算量卻不同。例如當a 2 3 b 3 4...