• 矩阵链相乘实例


    题目描述

    零崎有很多朋友,其中有一个叫jhljx。

    jhljx大家很熟悉了,他数学不好也是出了名的,大家都懂。

    现在jhljx遇到了矩阵乘法,他当时就懵了。数都数不清的他,矩阵乘法怎么可能会算的清楚呢?虽然零崎觉得还不如让你们来算,不过好歹也要给jhljx个面子,给她留下一个证明自己数学实力的机会。为了减小jhljx的计算量,让他赶快算出不正确答案来(估计他算上几遍都不一定能出一个正确答案),零崎请你们帮助jhljx。

    输入

    多组输入数据。

    每组数据以N开始,表示矩阵链的长度。接下来一行N+1个数表示矩阵的行/列数。

    1<=N<=300

    输出

    对于每组样例,输出一行最少运算次数的方案,每两个矩阵相乘都用“()”括起来,详见样例

    如果存在多种解决方案,最终输出结果选取先计算左边的矩阵,详见Hint

    输入样例

    3
    10 30 5 60
    3
    10 20 5 4

    输出样例

    ((A1A2)A3)
    ((A1A2)A3)

    Hint

    对于输入的第二组数据,

    如果计算顺序为((A1A2)A3),结果为10×20×5 + 10×5×4= 1200,

    如果计算顺序为A1(A2A3), 结果为20×5×4 + 10×20×4 = 1200

    那么输出结果选取第一个

    题目来源:http://biancheng.love/contest/17/problem/D/index

    题目注意事项:如果存在多种解决方案,最终输出结果选取先计算左边的矩阵

    下面给出实现代码:

     1 #include <bits/stdc++.h>
     2 #define max_size 400
     3 #define INF 100000000
     4 long long s[max_size][max_size];//保存构造最优解信息
     5 long long p[max_size];//矩阵规模的记录
     6 long long m[max_size][max_size];//记录最优值
     7 
     8 void  matrix_chain_order(int n)
     9 {
    10     for(int i=1;i<=n;i++)
    11     {
    12         m[i][i]=0;//初始化最优值(起始于1,结束于n)
    13     }
    14     for(int l=2;l<=n;l++)//l表示矩阵的长度
    15     {
    16         for(int i=1;i<=n-l+1;i++)
    17         {
    18             int j=i+l-1;
    19             m[i][j]=INF;
    20             s[i][j]=0;
    21             for(int k=j-1;k>=i;k--)//解决方案优先选取先左边的矩阵
    22             {
    23                 int q=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
    24                 if(q<m[i][j])
    25                 {
    26                     m[i][j]=q;
    27                     s[i][j]=k;
    28                 }
    29             }
    30         }
    31     }
    32 }
    33 
    34 void print_optimal_parents(int i,int j)//打印最优解的结果
    35 {
    36     if(i==j)
    37         printf("A%d",i);
    38     else
    39     {
    40             printf("(");
    41             print_optimal_parents(i,s[i][j]);
    42             print_optimal_parents(s[i][j]+1,j);
    43             printf(")");
    44     }
    45 }
    46 
    47 int main()
    48 {
    49     int n;
    50     while(~scanf("%d",&n))
    51     {
    52         memset(p,0,sizeof(p));
    53         for(int i=0;i<=n;i++)
    54         {
    55             scanf("%lld",&p[i]);
    56         }
    57         matrix_chain_order(n);
    58         print_optimal_parents(1,n);
    59         printf("
    ");
    60     }
    61 }

    对实现过程的详细解答请见http://www.cnblogs.com/Anker/archive/2013/03/10/2952475.html

  • 相关阅读:
    DataTable轉EXCEL 3/21
    中風預防知識
    unable to convert mysql date/time value to system.data.time 11/14
    win8 获得地理坐标 GIS
    页面嵌套 GIS
    win8 metro 弹出一个部分 GIS
    正则表达式基础 之 ? GIS
    windows phone pivot 开发过程中的使用心得 GIS
    线程不安全 GIS
    线程基础知识 GIS
  • 原文地址:https://www.cnblogs.com/zpfbuaa/p/4966354.html
Copyright © 2020-2023  润新知