輸入:
共兩行第一行 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 ...