您的位置:首页 > 编程语言 > Go语言

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")
}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息