• 动态规划求矩阵连乘


    原创


    在科学计算中经常要计算矩阵的乘积。矩阵A和B可乘的条件是矩阵A的列数等于矩阵B的行数。若A是一个p×q的矩阵,B是一个q×r的矩阵,

    则其乘积C=AB是一个p×r的矩阵。由该公式知计算C=AB总共需要pqr次的数乘。其标准计算公式为:

     

    现在的问题是,给定n个矩阵{A1,A2,…,An}。其中Ai与Ai+1是可乘的,i=1,2,…,n-1。要求计算出这n个矩阵的连乘积A1A2…An,最少的乘法次数。

    递归公式:

     1 import java.util.*;
     2 
     3 public class 算法分析与设计3_2 {
     4     
     5     static void traceback(int i,int j,int s[][])
     6     {
     7         if(i==j)
     8             System.out.print("A"+i);
     9         else if (i==j-1)
    10             System.out.print("(A"+i+"A"+j+")");
    11         else
    12         {
    13             System.out.print("(");
    14             traceback(i,s[i][j],s);
    15             traceback(s[i][j]+1,j,s);
    16             System.out.print(")");
    17         }
    18      }
    19 
    20     
    21     static void min_Matrix(int matrix[][],int n,int m[][],int s[][]) {
    22         for(int i=1;i<=n;i++) {    //单个矩阵
    23             m[i][i]=0;
    24         }
    25         for(int r=2;r<=n;r++) {
    26             for(int i=1;i<=n-r+1;i++) {
    27                 int j=i+r-1;
    28                 m[i][j]=m[i][i]+m[i+1][j]+matrix[i][1]*matrix[i][2]*matrix[j][2];    //分为[i,i]和[i+1,j]两段
    29                 s[i][j]=i;
    30                 for(int k=i+1;k<j;k++) {    //分为[i,k]和[k+1,j]两段
    31                     int t=m[i][k]+m[k+1][j]+matrix[i][1]*matrix[k][2]*matrix[j][2];
    32                     if(t<m[i][j]) {
    33                         m[i][j]=t;
    34                         s[i][j]=k;
    35                     }
    36                 }
    37             }
    38         }
    39     }
    40 
    41     public static void main(String[] args) {
    42         Scanner reader=new Scanner(System.in);
    43         System.out.print("输入矩阵个数: ");
    44         int n=reader.nextInt();
    45         System.out.print("输入"+n+"个矩阵规模:");
    46         int matrix[][]=new int[n+1][3];
    47         int m[][]=new int[n+1][n+1];
    48         int s[][]=new int[n+1][n+1];
    49         for(int i=1;i<=n;i++) {    //输入矩阵规模
    50             matrix[i][1]=reader.nextInt();
    51             matrix[i][2]=reader.nextInt();
    52         }
    53         min_Matrix(matrix,n,m,s);
    54         System.out.println(m[1][n]);
    55         System.out.print("序列:");
    56         traceback(1,n,s);
    57     }
    58 
    59 }

    15:28:56

    2018-10-15

  • 相关阅读:
    c文件操作库
    双链常用操作2
    双向链表常用操作
    c队列操作
    c日期格式化操作之date
    单链常用操作类
    c字符串常用操作
    双向链表通用类
    c栈操作
    poj2509
  • 原文地址:https://www.cnblogs.com/chiweiming/p/9791271.html
Copyright © 2020-2023  润新知