• 最优矩阵连乘问题 区间DP


    最优矩阵连乘积

    Accepted: 10 Total Submit: 18
    Time Limit: 1000ms Memony Limit: 32768KB

    Description

    在科学计算中经常要计算矩阵的乘积。矩阵A和B可乘的条件是矩阵A的列数等于矩阵B的行数。若A是一个p×q的矩阵,B是一个q×r的矩阵,则其乘积C=AB是一个p×r的矩阵。其标准计算公式为:

    最优矩阵连乘

    由该公式知计算C=AB总共需要pqr次的数乘。

    为了说明在计算矩阵连乘积时加括号方式对整个计算量的影响,我们来看一个计算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。第二种加括号方式的计算量是第一种加括号方式的计算量的10倍。由此可见,在计算矩阵连乘积时,加括号方式,即计算次序对计算量有很大影响。

    于是,人们自然会提出矩阵连乘积的最优计算次序问题,即对于给定的相继n个矩阵{A1,A2,…,An}(其中Ai的维数为pi-1×pi ,i=1,2,…,n),如何确定计算矩阵连乘积A1A2…An的一个计算次序(完全加括号方式),使得依此次序计算矩阵连乘积需要的数乘次数最少。

    Input

    有若干种案例,每种两行,第一行是一个非负整数n表示矩阵的个数,n=0表示结束。接着有n行,每行两个正整数,表示矩阵的维数。

    Ouput
    对应输出最小的乘法次数。

    Sample Input

    3

    10 100

    100 5

    5 50

    6

    30 35

    35 15

    15 5

    5 10

    10 20

    20 25

    0

    Sample Output

    7500

    15125

    #include<iostream>
    #include<string.h>
    #include<algorithm>
    #include<math.h>
    #define ll long long
    using namespace std;
    int dp[105][105],p[105];//dp[i][j]表示从第i个矩阵到第j个矩阵相乘的最少次数是dp[i][j]
    int main()
    {
        int n;//n个矩阵相乘
        cin>>n;
        for(int i=0;i<n;i++)//输入矩阵的行数和列数
            cin>>p[i]>>p[i+1];
        memset(dp,0,sizeof(dp));
        for(int len=2;len<=n;len++)//区间长度
        {
            for(int i=1;i<=n;i++)//起始位置
            {
                int cnt=99999999;
                int j=i+len-1;//结束位置
                if(j>n)
                    break;
                for(int k=i;k<j;k++)//分割点k
                    cnt=min(cnt,dp[i][k]+dp[k+1][j]+p[i-1]*p[k]*p[j]);
                dp[i][j]=cnt;
            }
        }
        cout<<dp[1][n]<<endl;
        return 0;
    }
  • 相关阅读:
    “爆奇葩”项目之索引页
    android 的生命周期自我理解
    Jquery Mobile 中文API站
    根据两点经纬度计算距离
    sql语句查询经纬度范围
    Asp.net core 笔记
    Docker 笔记
    IOC和DI
    PHP学习笔记十、图像处理
    PHP学习笔记九、cookie与session
  • 原文地址:https://www.cnblogs.com/-citywall123/p/11714410.html
Copyright © 2020-2023  润新知