zoukankan      html  css  js  c++  java
  • 矩阵连乘----动态规划

    问题描述
      有n个矩阵,大小分别为a0*a1, a1*a2, a2*a3, ..., a[n-1]*a[n],现要将它们依次相乘,只能使用结合率,求最少需要多少次运算。
      两个大小分别为p*q和q*r的矩阵相乘时的运算次数计为p*q*r。
    输入格式
      输入的第一行包含一个整数n,表示矩阵的个数。
      第二行包含n+1个数,表示给定的矩阵。
    输出格式
      输出一个整数,表示最少的运算次数。
    样例输入
    3
    1 10 5 20
    样例输出
    150
    数据规模和约定

    1<=n<=1000, 1<=ai<=10000。

    ----------------------------------------------------------------------------------------------(^U^)ノ~YO

    为了说明在计算矩阵连乘积时计算次序对整个计算量的影响,我们来看一个计算3个矩阵{A1,A2,A3}的连乘积的例子。设这3个矩阵的维数分别为10×100,100×5和5×50。

    若按第一种方式((A1A2)A3)来计算,需要10×100×5+10×5×50=7500次的数乘。

    若按第二种方式(A1(A2A3))来计算,需要100×5×50+10×100×50=75000次的数乘。

    由此可见,在计算矩阵连乘积时,计算次序对计算量有很大影响。


    下面的参考连接是我找到最详细的,看完差不多就明白啦!!!

    参考:http://blog.csdn.net/ljp1919/article/details/42610837




    m[i][j]为第i个矩阵到第j个矩阵连乘的最小乘法数

    #include <iostream>
    
    using namespace std;
    
    void MatrixChainOrder(int *p,int **m,int n)
    {
        int l,i,j,k;  //l表示矩阵链的长度
        int q;
    
        for(int i=1; i<=n; i++)
        {
            m[i][i]=0;//m[i][i]只有一个矩阵,所以相乘次数为0,即m[i][i]=0
        }
        //l表示矩阵链的长度
    	// l=2时,计算 m[i,i+1],i=1,2,...,n-1 (长度l=2的链的最小代价)
        for(l=2; l<=n; l++)
        {
            for(i=1; i<=n-l+1; i++) //
            {
                j=i+l-1;//以i为起始位置,j为长度为l的链的末位
                m[i][j]=0x7fffffff;
                //k从i到j-1,以k为位置划分
                for(k=i; k<=j-1; k++)
                {
                    q=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
                    if(q<m[i][j])//寻找最小结果
                    {
                        m[i][j]=q;
                    }
                }
            }
        }
        cout<<m[1][n];
    }
    
    int main()
    {
        int n;
        while(cin>>n)
        {
            int *p=new int[n+1];
            for(int i=0; i<=n; i++) //p为矩阵链
                cin>>p[i];
    
            int **m=new int*[n+1];  //m为存储最优结果的二维矩阵
            for(int i=0; i<=n; i++)
            {
                m[i]=new int[n+1];
            }
            MatrixChainOrder(p,m,n);
        }
        return 0;
    }
    


  • 相关阅读:
    1.初识Redis
    2.API的理解和使用
    8.rabbitmq RPC模拟微服务架构中的服务调用
    9.[完]其他常用的rabbitmq的参数和设置
    6.Header交换机之模拟验证用户身份
    C#中复制文件夹及文件的两种方法
    python通过递归将多维字典转化为二维
    python venv flask gunicorn 部署与 pycharm 连接
    Nagios(centos 6.5)调用NSClient++/NRPE+Powershell脚本(windows server 2008 r2)监控网络情况
    Nagios 调用华为云短信平台进行报警
  • 原文地址:https://www.cnblogs.com/zhanyeye/p/9746121.html
Copyright © 2011-2022 走看看