給定n個矩陣,其中ai和ai+1是可乘的,考察這n個矩陣的連乘積a1a2…an。由於矩陣的乘法滿足結合律,故計算矩陣的連乘積有許多不同的計算次序,而不同的計算次序,所需要計算的連乘次數也是不同的,求解連乘次數最少的矩陣連乘最優次序。
**
#include
"stdafx.h"
int p[
100]
,s[100][
100]
,n;//計算最優值
intlookupchain
(int i,
int j,)}
return u;
}//構造最優解
void
traceback
(int i,
int j,
int s[
100]
[100])
intmain()
printf
("最優值為:%d\n"
,lookupchain(1
,n))
;printf
("最優解為:\n");
traceback(1
,n,s)
;printf
("\n");
return0;
}
#include
"stdafx.h"
//計算最優值
void
matrixchain
(int
* p,
int n,
int m[
100]
[100],
int s[
100]
[100])
for(
int r =
2; r<= n; r++)}
}}}//構造最優解
void
traceback
(int i,
int j,
int s[
100]
[100])
intmain
(int argc,
char
* ar**)
matrixchain
(p,n+
1,m,s)
;printf
("最優值為:%d\n"
,m[1
][n]);
printf
("最優解為:\n");
traceback(1
,n,s)
;return0;
}
測試遞迴程式:測試過程:輸入矩陣個數3,然後輸入矩陣的行和列之後回車,系統輸出最優值和最優解。
測試動態規劃程式:
測試過程:輸入矩陣個數5,然後輸入矩陣的行和列之後回車,系統輸出最優值和最優解。
根據計算m[ i ][ j ]的遞迴式,容易寫乙個遞迴演算法計算m[1][n]。但是簡單地遞迴將耗費指數計算時間。在遞迴計算時,許多子問題被重複計算多次。這也是該問題可以用動態規劃演算法求解的又一顯著特徵。
用動態規劃演算法解決此問題,可依據其遞迴是以自底向上的方式進行計算。在計算的過程中,儲存已解決的子問題答案。每個子問題只計算一次,而在後面需要時只要簡單查一下,從而避免大量的重複計算。
矩陣連乘 動態規劃 動態規劃解矩陣連乘問題
一.矩陣鏈事例 矩陣鏈問題主要涉及的時在多個矩陣相乘,如何通過相乘的順序來減少程式執行。二.例題分析 這次分析過程按照動態規劃的三個基本條件來逐步解答 1 尋找最優子結構 假設我們已經找到父矩陣鏈最優解,當我們劃分到最後一步時都是兩個子矩陣鏈 分別被括號包圍 相乘,如 a1a2a3a4 a5a6a7...
python矩陣連乘 動態規劃 矩陣連乘問題
一 問題描述 給定n個數字矩陣a1,a2,an,其中ai與ai 1是可乘的,設ai是pi 1 pi矩陣,i 1,2,n。求矩陣連乘a1a2.an的加括號方法,使得所用的乘次數最少。例子三個矩陣連乘,可以有 a1a2 a3和a1 a2a3 兩種方法求積 乘法次數分別為 p0p1p2 p0p2p3和p0...
動態規劃 矩陣連乘問題
給定n 1個矩陣 a0,a1,a2,an 1 其中ai與ai 1是可乘的,i 0,1,2,n 2。矩陣乘法滿足結合律。考察這n個矩陣的連乘積,得出運算次數最少的結合。首先,考慮兩個矩陣相乘。如果a b兩個矩陣可以相乘,那麼a b的形式必定滿足 a p q b q r 設c a b,那麼c滿足c p ...