矩陣連乘問題

2021-10-03 18:30:36 字數 1316 閱讀 3201

問題描述:

矩陣連乘問題是通過給矩陣連乘時加括號,使得總的計算量最小。

考慮3個矩陣相乘的例子, a1,a2,a3,假設這3個矩陣的維數分別為 10x100,100x50,5x50

若按照((a1a2)a3)方式計算,需要的數乘次數為10x100x5+10x5x50 = 7500

若按照(a1(a2a3))方式計算,需要的數乘次數為100x5x50+10x100x50 =75000

思路:你可以理解為給你乙個區間問你這個區間裡面有多少種區間長度為2的組合。(可能說的不太清楚,舉個例子)

如果 給你區間[1,3],我們可以把這個區間拆成[1,1] + [2,3] 或者[1,2]+[3,3],那麼問題就是保證區間長度最大值為2一共有多少種拆法,然後從所有拆法中選取乙個最小值,那麼問題就解決了。

對於乙個區間[l,r]我們可以列舉拆開的位置k(i<=k#include

using

namespace std;/*4

50 10 40 30 5

*/const

int maxn =

1e3+10;

int p[maxn]

;const

int inf =

0x3f3f3f3f

;int

dfs(

int l,

int r)

return res;

}int

main()

dp版本

dp [ i ] [ j ] : 區間[i,j]的最小連乘數

轉移方程:

dp [ i ] [ j ] = dp [ i ] [ k] + dp [ k + 1 ] [ j ] + p[ i - 1 ] * p[ j ] * p[ k ]

這個**寫起來有點多特殊,它是列舉的區間長度從[2,n],然後它是斜對角線式計算子問題的。(一開始沒有想到,就是只有從上到下做的,就出現呼叫子結果,但是子結果還沒有計算的尷尬局面,列舉長度,斜對角線計算就不會出現這樣的問題了。完美!)

**:

#include

using

namespace std;/*4

50 10 40 30 5

*/const

int maxn =

1e3+10;

int p[maxn]

;const

int inf =

0x3f3f3f3f

;int dp[maxn]

[maxn]

;//dp[i][j]:區間[i,j]最少連乘次數

intmain()

}}cout<[n]<}

矩陣連乘問題

矩陣連乘問題 應用動態規劃演算法,將前面計算的重複值儲存,一次來推進下一步的計算,直到得到m 1 n 的值,為最少的乘法次數 m i j 表示計算a i.j 所需的最少數乘次數 m i j min i s i j 記錄斷開位置,也就是最少計算次數的中間位置。include using namespa...

矩陣連乘問題

由於矩陣的乘法滿足結合律,故計算矩陣的連乘積可以有許多不同的計算次序。這中計算次序 可以用加括號的方式來確定。例如,矩陣連乘積a1a2a3a4可以有5種不同的完全加括號方式 a1 a2 a3a4 a1 a2a3 a4 a1a2 a3a4 a1 a2a3 a4 a1a2 a3 a4 矩陣a和b可乘的條...

矩陣連乘問題

矩陣連乘問題 問題分析 最優子結構性質假設n個矩陣連乘的最優加括號方案為 a1.ak ak 1.an 注 此處省略了a1.ak,ak 1.an兩個子矩陣內部的括號 則加括號方案 a1.ak 是子矩陣鏈a1.ak的最優加括號方案,ak 1.an 是ak 1.an的最優加括號方案。證明略。但可證明該假設...