题意:计算矩阵连乘的计算次数 ,每一次相乘次数都是 新矩阵的R*C * N(旧的矩阵的列)
#include <iostream> #include <cstdio> #include <cstring> using namespace std; struct node { char name ; int row; int col; }; node m[1000]; node stack1[1000]; char a[1000],b[1000],stack2[1000]; int main() { int j,n,sum,top1,top2; cin>>n; for (int i = 0 ; i < n ; i++) { cin>>m[i].name; cin>>m[i].row>>m[i].col; } while (cin>>a) { j=0,sum=0,top1=-1,top2=-1; // 这一段是检查是否可以构成连乘 for (int i = 0 ; i < strlen(a) ; i++) if(isupper(a[i])) { b[j] = a[i]; j++; } b[j] = '\0' ; int flag = 0; for (int i = 0 ; i < strlen(b)-1 ; i++ ) //矩阵连乘时的性质,所以从左到右扫描一边是成立的 if (m[b[i]-'A'].col!=m[b[i+1]-'A'].row) { flag = 1; break; } if (flag ==1) { puts("error"); continue; } else // 开始计算 { for (int i=0; i<(int)strlen(a); i++) { if (isalpha(a[i])) { top1++; stack1[top1]=m[a[i]-'A']; } if (a[i] == '(') { top2++; stack2[top2] = '('; } if ( a[i] == ')') { top2--; sum+=stack1[top1].row*stack1[top1].col*stack1[top1-1].row; top1--; stack1[top1].col=stack1[top1+1].col; } } cout<<sum<<endl; } } return 0; }