// m[i][j]表示第i个矩阵到第j个矩阵进行矩阵链乘的最小计算数 m := make([][]int, n+1) for i := range m { m[i] = make([]int, n+1) } // s[i][j]表示使得 第i个矩阵到第j个矩阵进行矩阵链乘的计算数最小 的分割点 s := make([][]int, n+1) for i := range s { s[i] = make([]int, n+1) }
for l := 2; l <= n; l++ { // l:chain length for i := 1; i <= n-l+1; i++ { j := i + l - 1 m[i][j] = INFINITY for k := i; k <= j-1; k++ { q := m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j] if q < m[i][j] { m[i][j] = q s[i][j] = k } } } }
fmt.Println("矩阵M:") for _, v := range m { fmt.Println(v) } fmt.Println("矩阵链乘的最小计算数:", m[1][n]) fmt.Println("----------------------") fmt.Println("矩阵S:") for _, v := range s { fmt.Println(v) } fmt.Println("使得矩阵链乘计算数最小的计算次序:") displayPriority(s, 1, n) }
// 根据断点位置递归的去加括号 funcdisplayPriority(s [][]int, i, j int) { if i == j { fmt.Printf("A%d", i) } else { fmt.Print("(") displayPriority(s, i, s[i][j]) displayPriority(s, s[i][j]+1, j) fmt.Print(")") } }