标签:sys 初始 out rgs queue test 描述 class sem
问题描述:给定n个矩阵{A1,A2,...,An},其中Ai与Ai+1是可乘的,我们要计算这n个矩阵的最少计算次数。
将多个矩阵连乘抽象为最后一次计算即两个矩阵相乘。
1 public static void test(int[]p) {
2 int n=p.length-1;
3 int[][] m=new int[n+1][n+1];//m[i][j]是i到j的最少计算次数
4 int[][] s=new int[n+1][n+1];//s[i][j]记录最优的m[i][j]最后两个矩阵的分割处
5 //初始值,递归出口
6 for(int i=1;i<=n;i++)
7 m[i][i]=0;
8 int j=0;
9 for(int r=2;r<=n;r++) {
10 for(int i=1;i<=n-r+1;i++) {
11 j=i+r-1;
12 m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];//初始值
13 s[i][j]=i;
14 for(int k=i+1;k<=j-1;k++) {
15 int temp=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
16 if(temp<m[i][j]) {//更新
17 m[i][j]=temp;
18 s[i][j]=k;
19 }
20 }
21 }
22 }
23 System.out.println("-----------m------------");
24 for(int i=1;i<=n;i++) {
25 for(j=1;j<=n;j++) {
26 System.out.print(m[i][j]+" ");
27 }
28 System.out.println();
29 }
30 System.out.println("-----------s------------");
31 for(int i=1;i<=n;i++) {
32 for(j=1;j<=n;j++) {
33 System.out.print(s[i][j]+" ");
34 }
35 System.out.println();
36 }
37 Queue<Duan> q=new LinkedList<Duan>();
38 q.add(new Duan(s[1][n]+1,n));
39 q.add(new Duan(1,s[1][n]));
40 String[] strings=new String[n+1];
41 for(int i=1;i<=n;i++) {
42 strings[i]="A"+i;
43 }
44 while(!q.isEmpty()) {
45 Duan t=q.poll();
46 if(t.start!=t.end) {
47 strings[t.start]="("+strings[t.start];
48 strings[t.end]=strings[t.end]+")";
49 if(t.end-t.start>1) {
50 q.add(new Duan(s[t.start][t.end]+1,t.end));
51 q.add(new Duan(t.start,s[t.start][t.end]));
52 }
53 }
54 }
55 System.out.println("-----------式子------------");
56 for(int i=1;i<=n;i++) {
57 System.out.print(strings[i]);
58 }
59 }
60 public static void main(String[] args) {
61 int[]p= {1,5,10,100,1,2,100};
62 test(p);
63 }
1 class Duan{
2 int start;
3 int end;
4 public Duan(int start, int end) {
5 this.start = start;
6 this.end = end;
7 }
8 }
标签:sys 初始 out rgs queue test 描述 class sem
原文地址:https://www.cnblogs.com/code-fun/p/12693270.html