矩阵连乘问题

来源:互联网 发布:台州职业技术学院网络 编辑:程序博客网 时间:2024/05/24 15:43

题目描述

已知一组连乘矩阵的各维长度,要求计算并输出计算量最小的计算顺序表达式。

输入

每行为一组连乘矩阵的各维长度,行中第一个数字是连乘矩阵的个数n,n≤100,后面是n+1个维长。 矩阵个数为0表示输入结束。

输出

对每行输入,计算最优计算顺序,并以括号形式将计算表达式输出,各矩阵用A0, A1, ..的形式表示。

样例输入

1 10 202 10 20 303 10 20 30 406 30 35 15 5 10 20 250

样例输出

A0A0A1(A0A1)A2(A0(A1A2))((A3A4)A5)

//问题 B: 矩阵最优连乘问题

#include<iostream>
using namespace std;
void matrix_chain(int *p,int n,int m[][100],int s[][100]);
void trace_back(int i,int j,int s[][100]);
int main()
{
    int size[100],total,i=0,m[100][100],s[100][100],j;
    while(cin>>total&&total!=0)
    {
        while(i<=total)
        {
          cin>>size[i++];
        }
        matrix_chain(size,total,m,s);
        trace_back(1,total,s);
        cout<<endl;
    }
    return 0;
}                    //p[]矩阵下标
void matrix_chain(int *p,int n,int m[][100],int s[][100])
{
    int i,j,k,r,t;
    for(i=1;i<=n;i++)
    {
        m[i][i]=0;
    }
    for(r=2;r<=n;r++)
    {
        for(i=1;i<=n-r+1;i++)
        {
            j=i+r-1;
            m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];                 //假设第一个点为最佳断开位置,求其计算次数
            s[i][j]=i;                                          //记录断开点位置
            for(k=i+1;k<j;k++)
            {
                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;
                }
            }
        }
    }
}
void trace_back(int i,int j,int s[][100])
{
    if(i==j)
    {
        cout<<"A"<<i-1;
        return ;
    }
    if(i==1)
    {
        trace_back(i,s[i][j],s);
    trace_back(s[i][j]+1,j,s);
    }
    else
    {


        cout<<"(";
    trace_back(i,s[i][j],s);
    trace_back(s[i][j]+1,j,s);
    cout<<")";
    }


}

0 0
原创粉丝点击