BUCT OJ 矩阵最优连乘问题

来源:互联网 发布:北京东路的日子 知乎 编辑:程序博客网 时间:2024/05/20 00:51

题目描述

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

输入

每行为一组连乘矩阵的各维长度,行中第一个数字是连乘矩阵的个数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)

提示

输出格式中,不要有多余的括号。

#include<iostream>#include<algorithm>#include<cstdio>#include<vector>#include<cstdlib>#include<cstring>using namespace std;int dp[205][205];int s[205][205];int a[205];int n;void print(int i,int j,int t){    if(i==j){        cout<<"A"<<i-1;    }    else{        if(t!=0)        cout<<"(";        print(i,s[i][j],t+1);        print(s[i][j]+1,j,t+1);        if(t!=0)        cout<<")";    }}int main(){    int n;    while(~scanf("%d",&n)&&n!=0){        int i,j,k;        int length;        //memset(s,0,zizeof(s));        n++;        for(i=0;i<n;i++){            scanf("%d",&a[i]);            dp[i][i]=0;        }        int t;        for(length=2;length<=n;length++){            for(i=1;i<=n-length+1;i++){                j=i+length-1;                dp[i][j]=0x7fffffff;                for(k=i;k<=j-1;k++){                    t=dp[i][k]+dp[k+1][j]+a[i-1]*a[k]*a[j];                    if(t<dp[i][j]){                        dp[i][j]=t;                        //printf("%d\n",dp[i][j]);                        s[i][j]=k;                    }                }            }        }        //printf("%d\n",dp[1][n-1]);        print(1,n-1,0);        cout<<endl;    }    return 0;}


0 0