利用動態規劃解決連乘問題

2021-07-09 03:08:52 字數 1412 閱讀 9684

動態規劃過程是:每次決策依賴於當前狀態,又隨機引起狀態的轉移。乙個決策序列就是在變化的狀態中產生,所以,這種多階段最優化決策解決問題的過程稱為動態規劃。

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

演算法描述:

將矩陣連乘積簡記為a[i:j] 

,這裡i

≤j     

設這個計算次序在矩陣ak和

ak+1

之間將矩陣鏈斷開,i≤

k,則其相應完全加括號方式為

**實現:

#includeusing namespace std;

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

for(int i = 1;i <= n;i++)

m[i][i] = 0;//初始化矩陣

// r 表示每次寬度

// i,j表示從從矩陣i到矩陣j

// k 表示切割位置

for(int r = 2;r <= n;r++)

for(int i = 1;i <= n-r+1li++){

int j = i+r-1;

// 從矩陣i到矩陣j連乘,從i的位置切割,前半部分為0

m[i][j] = m[i+1][j] + p[i-1]*p[i]*p[j];

s[i][j] = i;

for(int k = i+1;k < j;k++){

int t = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];

if(t

執行結果

算例分析初始條件**m

(用於存放過程),陣列

p(所要計算的值),

**s(用於存放連乘次數)。演算法

matrixchain

的主要計算量取決於演算法中對r,

i和k的

3重迴圈。迴圈體內的計算量為

o(1),而3

重迴圈的總次數為

o(n3)

。因此演算法的計算時間上界為

o(n3)

。演算法所占用的空間顯然為

o(n2)

學習該演算法心得

動態規劃法是求解最優化問題的一種方法,

動態規劃演算法與

分治法類似,其基本思想也是將待求解問題分解成若干個子問題,先求解子問題,然後從

這些子問題的解得到原問題的解。

矩陣連乘 動態規劃 動態規劃解矩陣連乘問題

一.矩陣鏈事例 矩陣鏈問題主要涉及的時在多個矩陣相乘,如何通過相乘的順序來減少程式執行。二.例題分析 這次分析過程按照動態規劃的三個基本條件來逐步解答 1 尋找最優子結構 假設我們已經找到父矩陣鏈最優解,當我們劃分到最後一步時都是兩個子矩陣鏈 分別被括號包圍 相乘,如 a1a2a3a4 a5a6a7...

動態規劃 矩陣連乘問題

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

動態規劃 矩陣連乘問題

以下只是對此問題的乙個 實現,具體理論部分請參見王曉東 演算法設計與分析 第2 版3.1 節 矩陣連乘問題。include include using namespace std define max count 20 矩陣屬性 struct tagmatrixattribute 矩陣連乘加括號求解...