|
| 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