Skip to content

Commit 2ac3137

Browse files
committed
implement matrix chain multiplication
1 parent 34f5c59 commit 2ac3137

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
// matrix chain multiplication problem
2+
// https://en.wikipedia.org/wiki/Matrix_chain_multiplication
3+
// www.geeksforgeeks.org/dynamic-programming-set-8-matrix-chain-multiplication/
4+
5+
// package main
6+
package matrixChainMultiplication
7+
8+
import "fmt"
9+
10+
func min(a, b int) int {
11+
if a > b {
12+
return b
13+
} else {
14+
return a
15+
}
16+
}
17+
18+
func matrixChainRec(D []int, i, j int) int {
19+
// d[i-1] x d[i] : dimension of matrix i
20+
if i == j {
21+
return 0
22+
}
23+
q := 1 << 32
24+
for k := i; k < j; k++ {
25+
prod := matrixChainRec(D, i, k) + matrixChainRec(D, k+1, j) + D[i-1]*D[k]*D[j]
26+
q = min(prod, q)
27+
}
28+
return q
29+
}
30+
31+
func matrixChainDp(D []int) int {
32+
// d[i-1] x d[i] : dimension of matrix i
33+
N := len(D)
34+
35+
dp := make([][]int, N) // dp[i][j] = matrixChainRec(D, i, j)
36+
for i := 0; i < N; i++ {
37+
dp[i] = make([]int, N)
38+
dp[i][i] = 0
39+
}
40+
41+
for l := 2; l < N; l++ {
42+
for i := 1; i < N-l+1; i++ {
43+
j := i + l - 1
44+
dp[i][j] = 1 << 31
45+
for k := i; k < j; k++ {
46+
prod := dp[i][k] + dp[k+1][j] + D[i-1]*D[k]*D[j]
47+
dp[i][j] = min(prod, dp[i][j])
48+
}
49+
}
50+
}
51+
52+
return dp[1][N-1]
53+
}
54+
55+
/*
56+
func main() {
57+
D := []int{2, 2, 2, 2, 2} // 4 matrices
58+
fmt.Print(matrixChainRec(D, 1, 4), "\n")
59+
fmt.Print(matrixChainDp(D), "\n")
60+
}
61+
*/

0 commit comments

Comments
 (0)