Go语言动态规划矩阵连乘
2017-11-06 20:05
323 查看
package main import ( "bytes" "fmt" "math/rand" "strconv" "time" ) const ( //常量 min, max = 1, 100 ) var ( p [][]int A []int m [][]int s [][]int n, result int buf bytes.Buffer ) func Init() bool { //初始化切片 if n > 0 { rand := rand.New(rand.NewSource(time.Now().UnixNano())) //时间种子 for i := 0; i < n+1; i++ { A = append(A, (rand.Intn(max-min) + min)) //生成随机数 } //A = append(A, 10, 20, 3, 100, 7) //A = append(A, 30, 35, 15, 5, 10, 20, 25) for i := 0; i < n; i++ { p1 := make([]int, 0, 2) p = append(p, p1) } for i := 0; i < n; i++ { p[i] = append(p[i], A[i], A[i+1]) } for i := 0; i < n; i++ { m1 := make([]int, 0) for j := 0; j < n; j++ { m1 = append(m1, 0) } m = append(m, m1) } for i := 0; i < n; i++ { s1 := make([]int, 0) for j := 0; j < n; j++ { s1 = append(s1, 0) } s = append(s, s1) } return true } else { return false } } func Doolite() { q := 1 i := 0 j := i + q for { if j < n { for { m[i][j] = 999999 for k := i; k < j; k++ { result = m[i][k] + m[k+1][j] + p[i][0]*p[j][1]*p[k][1] if m[i][j] > result { m[i][j] = result s[i][j] = k } } if i < n-1-q { i = i + 1 j = i + q } else { break } } } else { break } i = 0 q = q + 1 j = i + q } } func Print(i, j int) { if j-i >= 2 { buf.WriteString("(") Print(i, s[i][j]) buf.WriteString(")") buf.WriteString("*") buf.WriteString("(") Print(s[i][j]+1, j) buf.WriteString(")") } else { if i == j { buf.WriteString(strconv.Itoa(i)) } else { buf.WriteString(strconv.Itoa(i)) buf.WriteString("*") buf.WriteString(strconv.Itoa(j)) } } } func main() { fmt.Println("请输入元素的个数:") fmt.Scanln(&n) if Init() { fmt.Println(A) t1 := time.Now() Doolite() Print(0, n-1) fmt.Println(p) fmt.Println(m) fmt.Println(s) fmt.Println(buf.String()) elapsed := time.Since(t1) fmt.Println("运行时间: ", elapsed) } else { fmt.Println("你输入的数据存在错误\a") } }