动态规划之矩阵链乘法

    对于给定的n个矩阵形成的矩阵链M1,M2,M3,......Mn,求计算乘积M1M2M3.....Mn时进行最少次标量相乘的运算顺序,这类问题就称为矩阵链乘法问题。

    例: 当给定矩阵Mi的维数后,求出计算n个矩阵的乘积M1M2M3....Mn时所需标量相乘运算的最少次数。

     

       

  运用动态规划法,对于M1M2只有一种计算方法,要p0*p1*p2次,M2M3也只有一种方法,要p1*p2*p3次,也就是MiMi-1只有一种方法,需要pi-1*pi*pi+1次乘法运算。

   接下来,如果是求M1M2M3,

                 (M1(M2M3))的成本=(M1)成本+(M2M3)成本+p0*p1*p3

                   ((M1M2)M3)的成本=(M1M2)成本+M3成本+p0*p2*p3

  一般情况下,矩阵链乘法(MiMi+1.....MJ)的最优解就是(MiMi+1.....Mk)(Mk+1.....Mj)的最小成本

定义二维数组m[i][j] 表示(MiMi+1......Mj)时所需乘法运算的最小次数

 当i=j时为0,除此之外为 min(c[i][k]+c[k+1][j]+p[i-1]p[k]p[j],c[i][j])

     代码如下:

#include <iostream>
#define N 110
using namespace std;


int main()
{
    int n;
    cin>>n;
    int p[N];
    for(int i=1;i<=n;i++) cin>>p[i-1]>>p[i];
    int c[N][N];
    for(int i=1;i<=n;i++) c[i][i]=0;
    for(int l=2;l<=n;l++)    //l为对象矩阵的数量
    {
        for(int i=1;i<=n-l+1;i++)  //从Mi开始
        {
            int j=l+i-1;          
            c[i][j]=999999999;
            for(int k=i;k<=j-1;k++)     //枚举k
            {
                c[i][j]=min(c[i][j],c[i][k]+c[k+1][j]+p[i-1]*p[j]*p[k]);
            }
        }
    }
    cout<<c[1][n]<<endl;
    return 0;
}

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值