hdu 1082 Matrix Chain Multiplication--表达式求值

来源:互联网 发布:iphone7屏幕录制软件 编辑:程序博客网 时间:2024/06/12 01:46
/*简单的表达式求解,计算过程是求两个矩阵乘法运算过程中有多少次元乘法(两个数字相乘),可能出现两个矩阵无法相乘的情况输出error*/#include<stdio.h>#include<string.h>struct node//矩阵信息{char n;//矩阵的名称int x,y,num;//矩阵的行数和列数以及得到这个矩阵前有多少次元乘法}p[30];char s[100];//存储表达式int len;//表达式的长度int n;int findk(int i){int you=1;i++;while(you){while(s[i]!='('&&s[i]!=')')i++;if(s[i]=='(')you++;else you--;i++;}return i-1;}node getnum(int i,int j)//求表达式的值,返回值是一个矩阵,其中包含得到这个矩阵所经过的元乘法次数{if(i==j)//若表达式是一个矩阵{int k=0;node cur;for(;k<n;k++){if(p[k].n==s[i])//找到这个矩阵{cur.x=p[k].x;cur.y=p[k].y;cur.num=0;break;}}if(k==n)//若找不到,返回的矩阵的乘法次数为-1{cur.num=-1;//之前误写为cur.n的时候居然也过了,杭电数据没测出来啊}return cur;}int ii=i+1,jj=j-1,kk=ii;//若表达式是个式子,ii、jj分别是这个表达式去掉前后括号后的头和尾node d1,d2,d3;//这个表达式应该是有两个表达式(也可能是矩阵)相乘得到的,d1、d2是两个表达式的值,d3是他们的积if(s[ii]=='(')//若第一个是个式子{kk=findk(ii);//找到这个式子的后括号d1=getnum(ii,kk);//求这个式子的值}else{//否则他应该是一个矩阵d1=getnum(ii,ii);kk=ii;}kk++;//第二个式子的开始处if(s[kk]=='(')//若他是个式子{d2=getnum(kk,jj);//求从kk到最后的式子的值}else//若他是个矩阵d2=getnum(jj,jj);if(d1.num==-1||d2.num==-1||d1.y!=d2.x)//若至少有一个是非法矩阵(即有不可相乘的矩阵相乘得到)或两个矩阵无法相乘{d3.num=-1;return d3;}d3.x=d1.x;//若合法,返回表达式的结果d3.y=d2.y;d3.num=d1.num+d2.num+d1.x*d1.y*d2.y;return d3;}int main(){int i; scanf("%d",&n);for(i=0;i<n;i++)//读入矩阵数据{getchar();p[i].n=getchar();scanf("%d%d",&p[i].x,&p[i].y);p[i].num=0;}getchar();while(gets(s)){len=strlen(s);node num=getnum(0,len-1);//计算式子的值if(num.num==-1)printf("error\n");elseprintf("%d\n",num.num);}return 0;}