假設我們要用標準的矩陣乘法來計算m1,m2,m3三個矩陣的成績m1m2m3,這三個矩陣的維數分別是210,102,210,如果把m1,m2相乘,然後再與m3相乘,那麼要乘2102+2210=80次,如果代之以用m2,m3相乘的結果去乘m1,那麼乘法的次數變成了10210+210*10=400,執行m1(m2m3)耗費的時間是執行乘法(m1m2)m3的5倍。
-input-
n表示矩陣的個數(<=100)
n+1個數,表示矩陣(<=100)
-output-
最小的乘法次數
卡特蘭數:
公式:f[n]=f[n-1]*f[1]+f[n-2]*f[2]...f[1]*f[n-1];
假設n=5
f[1]=1,f[2]=1,f[3]=2,f[4]=5;
可以像這樣分:
方法數=前面那部分的分法*後面那部分的分法
=f[1]*f[4];
以及這樣
加起來,卡特蘭數的公式就出來了
本題:dp,類似卡特蘭數的方法。
c[i][j]表示從i到j這個區域全部合併後最小的運算數量。
將i到j分成倆部分(k分界),那倆部分算出最優解後,合併那倆部分。
模擬k,c[i][j]=所得出的最小的值。
for
(int k=i+
1;k<=j;
++k)
//分界
c[i]
[j]=
min(c[i]
[j],c[i]
[k-1
]+c[k]
[j]+a[i]
*a[k]
*a[j+1]
);//原來所需運算數+新合併的運算數
**#include
int n,a[
101]
,c[101][
101]
,ans=0;
intmin
(int v,
int b)
intmain()
printf
("%d"
,c[0
][n-1]);}
矩陣鏈相乘 DP
n表示矩陣的個數 100 n 1個數,表示矩陣 100 output 最小的乘法次數 sample input 55 10 4 6 10 2 sample output 348 解題思路 按照題意,這幾個數只能結合相乘,不能交換相乘,也就是不能打亂數的排列順序 因為這個矩陣鏈的乘法hin是奇怪,一交...
矩陣鏈相乘Matchain
演算法設計技巧與分析 動態規劃僅供自己學習.輸入 n個矩陣的鏈的維數對應於正整數陣列r 1,2,n 是n個矩陣的行數,r n 1 是mn的列數 輸出 n個矩陣相乘的數量乘法的最小次數 例7.4 m1 5 10,m2 1 4,m3 4 6,m4 6 10,m5 10 2 c 1,1 0 c 1,2 2...
矩陣鏈相乘問題
矩陣的乘法定義如下 設a是m p的矩陣,b是p n的矩陣,則a與b的乘積為m n的矩陣,記作c ab,其中,矩陣c中的第i行第j列元素cij可以表示為 當多個矩陣相乘時,採用不同的計算順序所需的乘法次數不相同。例如,a是50 10的矩陣,b是10 20的矩陣,c是20 5的矩陣,計算abc有兩種方式...