zoukankan      html  css  js  c++  java
  • 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 }

     

  • 相关阅读:
    (收藏)Wp7开发中文网站
    (收藏)Andriod中文翻译组
    (1) BlackBerry 环境的配置:安装standalone版的BlackBerry安装包
    (2)把BlackBerry作为插件安装到已有的Eclipse中
    (收藏)一个很不错的编程网站
    Android Architecture
    在Eclipse Android中设置模拟器屏幕大小
    (收藏)C#网站
    (Android) Binding to Data with AdapterView
    ListView 的理解
  • 原文地址:https://www.cnblogs.com/code-fun/p/12693270.html
Copyright © 2011-2022 走看看