uva 348 Optimal Array Multiplication Sequence

来源:互联网 发布:修改网络摄像头ip地址 编辑:程序博客网 时间:2024/05/01 11:30

题意:给你n个矩阵,要你计算矩阵乘的最少运算量。

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N=12;struct node{    int x,y;}m[N];int map[N][N],ileft[N],iright[N];int dp(int,int);void find_ans(int,int);int main(){    int n,t_cnt=0;    while(scanf("%d",&n)!=EOF)    {        if(n==0) break;        memset(map,0,sizeof(map));        memset(ileft,0,sizeof(ileft));        memset(iright,0,sizeof(iright));        ileft[0]++;iright[n-1]++;        for(int i=0;i<n;i++) scanf("%d%d",&m[i].x,&m[i].y);        printf("Case %d: ",++t_cnt);        int ans=dp(0,n-1);        find_ans(0,n-1);        for(int i=0;i<n;i++)        {            if(i!=0) printf(" x ");            while(ileft[i]--) printf("(");            printf("A%d",i+1);            while(iright[i]--) printf(")");        }        //printf("ans=%d\n",ans);        puts("");    }    return 0;}int dp(int be,int end){    if(map[be][end]!=0) return map[be][end];    else if(end-be==1) {map[be][end]=m[be].x*m[end].y*m[end].x;return map[be][end];}    else if(end==be) return 0;    else    {        int imin=1<<30;        for(int i=be;i<end;i++)        {            imin=min(imin,dp(be,i)+dp(i+1,end)+m[be].x*m[end].y*m[i+1].x);        }        map[be][end]=imin;        return imin;    }}void find_ans(int be,int end){    if(be==end||be+1==end) return;    else    {        int imin=1<<30,pos;        for(int i=be;i<end;i++)        {            int temp=map[be][i]+map[i+1][end]+m[be].x*m[end].y*m[i+1].x;            if(imin>temp)            {                imin=temp;                pos=i;            }        }        if(pos!=be) {ileft[be]++;iright[pos]++;}        if(pos+1!=end) {ileft[pos+1]++;iright[end]++;}        find_ans(be,pos);find_ans(pos+1,end);    }}


原创粉丝点击