矩陣連乘問題 遞迴與動態規劃實現

2021-10-07 18:46:07 字數 1766 閱讀 9872

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