dp规划之矩阵连乘问题

 

问题描述:给定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 }

 

posted @ 2020-04-13 19:02  小帆敲代码  阅读(209)  评论(0编辑  收藏  举报