動態規劃 矩陣連乘問題

2022-05-06 09:18:14 字數 1283 閱讀 2752

輸入:

共兩行第一行 n ( 1<=n<=100 ),代表矩陣個數。

第二行有 n+1 個數,分別為 a1 、 a2 …… an+1 ( 1<=ak<=10 ), ak 和 ak+1 代表第 k 個矩陣是個 ak x ak+1 形的。

輸出:共兩行

第一行 m ,為最優代價。注:測試用例中 m 值保證小於 2^31

第二行為最優順序。如 (a1((a2a3)a4)) ,最外層也加括號。

注意:測試用例已經保證了輸出結果唯一,所以沒有aaa的情況.

解:

演算法其實不難,就是填表,注意填表時的順序,應該是斜線填充,一次填一根斜線。

動態規劃遞迴方程的建立:

子問題狀態的建模(很關鍵):令m[i][j]表示第i個矩陣至第j個矩陣這段的最優解。

顯然如果i=j,則m[i][j]這段中就乙個矩陣,需要計算的次數為0;

如果i>j,則m[i][j]=min,其中k,在i與j之間遊蕩,所以i<=k

這一段演算法不難,問題是輸出。弄了好久想了好幾種方法都沒成功。

書上的演算法貌似不對,遞迴倒是用的遞迴,但是書上的遞迴輸出有問題。。。。好羅嗦

正確的輸出**應該是這樣的:

void print(int i, int n, int point[101])

else if(i+1 == n) printf("(a%da%d)", i, n);

else

}

整體**如下,僅供參考:

#include"stdafx.h"

#include"stdio.h"

#include#define max 101

void print(int i, int n, int point[101])

else if(i+1 == n) printf("(a%da%d)", i, n);

else

}int main()

for(k = 2; k <= n; k++) //if

}//for t

}//for i

}//for k

//輸出順序

printf("%d\n", times[1][n]);

if(n == 1) printf("(a1)\n");

else

system("pause");

return 0;

}//main

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

一.矩陣鏈事例 矩陣鏈問題主要涉及的時在多個矩陣相乘,如何通過相乘的順序來減少程式執行。二.例題分析 這次分析過程按照動態規劃的三個基本條件來逐步解答 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 ...