矩陣連乘 動態規劃 詳解

2021-09-20 13:03:01 字數 1609 閱讀 8560

給定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)

當i(相當於對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)

//if

}//k

}//i

}//r

}//matrixchain

上面**中後面的k也相當於是從i到j-1遞增的,只是單獨把第乙個(k=i)提了出來.

對於 p=:

計算順序為:

對上例,共6個矩陣(a1~a6),n=6,當r=3時,r迴圈裡面的是3個矩陣的最優解,i從1->4,即求的是

(a1a2a3),(a2a3a4),(a3a4a5),(a4a5a6)這4個矩陣段(長度為3)的最優解.當i=2時(a2a3a4)的最優解為的較小值。

•矩陣連乘計算次序問題的最優解包含著其子問題的最優解。這種性質稱為最優子結構性質。 

•在分析問題的最優子結構性質時,所用的方法具有普遍性:首先假設由問題的最優解匯出的子問題的解不是最優的,然後再設法說明在這個假設下可構造出比原問題最優解更好的解,從而導致矛盾。 

•利用問題的最優子結構性質,以自底向上的方式遞迴地從子問題的最優解逐步構造出整個問題的最優解。最優子結構是問題能用動態規劃演算法求解的前提。

•遞迴演算法求解問題時,每次產生的子問題並不總是新問題,有些子問題被反覆計算多次。這種性質稱為子問題的重疊性質。 

•動態規劃演算法,對每乙個子問題只解一次,而後將其解儲存在乙個**中,當再次需要解此子問題時,只是簡單地用常數時間檢視一下結果。 

•通常不同的子問題個數隨問題的大小呈多項式增長。因此用動態規劃演算法只需要多項式時間,從而獲得較高的解題效率。

矩陣連乘(動態規劃)

題目描述 給定n個矩陣 a1,a2,an 其中ai與ai 1是可乘的,i 1,2 n 1。如何確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。例如 a1 a2 a3 a4 a5 a6 最後的結果為 a1 a2a3 a4a5 a6 最小的乘次為15125。思路 動態規劃演算...

動態規劃 矩陣連乘

includeusing namespace std 無論括號怎麼分這些連續相乘的矩陣,最後括號都可以歸結到只有兩對括號,把整個連乘的矩陣分成兩部分 0 i j m i j min i 遞迴計算矩陣連乘 int liancheng int i,int j,int p,int s return min...

動態規劃 矩陣連乘

動態規劃常常用來解決,具有最優子結構,重疊子問題的物件。最優子結構 即通過分析問題,將問題分解為多個子問題。然後每個子問題繼續分解為更多子問題。從底往上求出最有值,由最優值確定最優解。重疊子問題 在計算過程中不同子問題可能都會計算某個值。若每個子問題都去求解同乙個值,浪費時間。動態規規劃對每乙個子問...