DP 矩陣鏈相乘

2021-09-03 02:52:53 字數 1226 閱讀 5865

假設我們要用標準的矩陣乘法來計算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有兩種方式...