动态规划求解矩阵连乘

来源:互联网 发布:恺英网络王悦老婆 编辑:程序博客网 时间:2024/06/04 22:48

问题:
给定n个矩阵{A1,A2,……An},其中Ai与Ai+1是可乘的,i = 1,2,……,n-1。考察这n个矩阵的连乘积A1A2,……,An。加括号的位置不同,计算数乘次数不同。 计算最少数乘次数,并给出最优解。
得出递归式:
m[i][j]= 0 i=j
min{[i][k]+m[k+1][j]+pi-1pkpj} i

#include<iostream.h>#define MAX 100void MatrixChain(int p[MAX],int n,int m[MAX][MAX],int s[MAX][MAX]){    for(int i=1;i<=n;i++)        m[i][i]=0;    for(int r=2;r<=n;r++)                       //r控制几个矩阵一起乘        for(int i=1;i<=n-r+1;i++)           {            int j=i+r-1;                        //从第i个矩阵乘到第j个矩阵            m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j]; //m[i][j]记录最优解,先将m[i][j]初始化为用k=i分            s[i][j]=i;                          //s[i][j]记录在哪个位置分能得到最优解,初始化为i            for(int k=i+1;k<j;k++)            {                int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];  //递归公式                if(t<m[i][j])                {                    m[i][j]=t;                  //记录下一组中最小的解                    s[i][j]=k;                  //和最小时的k                }            }        }}void Traceback(int i,int j,int s[MAX][MAX])     //构造最优解{    if(i==j)        return;    Traceback(i,s[i][j],s);    Traceback(s[i][j]+1,j,s);    cout<<"Multiply A"<<i<<","<<s[i][j];    cout<<"and A"<<(s[i][j]+1)<<","<<j<<endl;}void main(){    int n,m[MAX][MAX],s[MAX][MAX],p[MAX];    cout<<"请输入矩阵个数"<<endl;    cin>>n;    cout<<"请输入各矩阵维数:"<<endl;    for(int i=0;i<=n;i++)                //p数组的起始坐标必须比i的起始小1,在p[i-1]中p[0]才有意义        cin>>p[i];    MatrixChain(p,n,m,s);    Traceback(1,n,s);}

这里写图片描述

该组测试数据的计算次序,m[i][j],s[i][j]如图所示。
这里写图片描述

原创粉丝点击