计算矩阵连乘
#include <cstdio> #include <cstdlib> //#define _OJ_ #define maxsize 100 typedef struct matrix { int row; int colum; } matrix; typedef struct stack1 { int top; int base;; char *elem; } stack1, *stack; stack creat_stack(void) { stack s; s = (stack) malloc (sizeof(stack1)); s->elem = (char*) malloc (sizeof(char) * maxsize); s->top = s->base = 0; return s; } void push(stack s, char data) { s->elem[s->top++] = data; } char pop(stack s) { return s->elem[--s->top]; } int isempty(stack s) { if(s->top == s->base) return 1; else return 0; } char get_top(stack s) { return s->elem[s->top - 1]; } // ---------------------------------------------------------------------------------------- // matrix // operater(matrix M, matrix T) // { // } int num_multi(stack s, char *str, matrix *M) { int sum = 0, i = 0; char ch1; while (str[i] != '\0') { // printf("%c\n", str[i]); if(isempty(s)) push(s, str[i]); else if(str[i] == '(') push(s, str[i]); else if('A' <= str[i] && str[i] <= 'Z') { if('A' <= get_top(s) && get_top(s) <= 'Z') { if(M[str[i] - 'A'].row != M[get_top(s) - 'A'].colum) return -1; sum += M[get_top(s) - 'A'].row * M[get_top(s) - 'A'].colum * M[str[i] - 'A'].colum; M[get_top(s) - 'A'].colum = M[str[i] - 'A'].colum; } else push(s, str[i]); } else if(str[i] == ')') { ch1 = pop(s); pop(s); if(isempty(s)) push(s, ch1); else { if(M[ch1 - 'A'].row != M[get_top(s) - 'A'].colum) return -1; sum += M[get_top(s) - 'A'].row * M[get_top(s) - 'A'].colum * M[ch1 - 'A'].colum; M[get_top(s) - 'A'].colum = M[ch1 - 'A'].colum; } } // printf("sum = =%d\n", sum); i++; } return sum; } int main(int argc, char const *argv[]) { #ifndef _OJ_ //ONLINE_JUDGE freopen("input.txt", "r", stdin); #endif int result, row1, colum1, T, i, j, n1, n2; char str[100]; char ch; matrix M[26]; stack s; s = creat_stack(); scanf("%d", &T); gets(str); while(T--) { scanf("%c %d %d", &ch, &row1, &colum1); M[ch - 'A'].row = row1; M[ch - 'A'].colum = colum1; // printf("%c %d %d\n", ch, row1, colum1); gets(str); } gets(str); result = num_multi(s, str, M); if(result == -1) printf("error\n"); else printf("%d\n", result); return 0; } /*给定n个矩阵{A1,A2,...,An},考察这n个矩阵的连乘积A1A2...An。由于矩阵乘法满足结合律, 故计算矩阵的连乘积可以有许多不同的计算次序,这种计算次序可以用加括号的方式来确定。 矩阵连乘积的计算次序与其计算量有密切关系。 例如,考察计算3个矩阵{A1,A2,A3}连乘积的例子。 设这3个矩阵的维数分别为10*100,100*5,和5*50。若按(A1A2)A3计算, 3个矩阵连乘积需要的数乘次数为10*100*5+10*5*50 = 7500。若按A1(A2A3)计算, 则总共需要100*5*50+10*100*50 = 75000次数乘。 现在你的任务是对于一个确定的矩阵连乘方案,计算其需要的数乘次数。 输入 输入数据由多组数据组成。每组数据格式如下: 第一行是一个整数n (1≤n≤26),表示矩阵的个数。 接下来n行,每行有一个大写字母,表示矩阵的名字,后面有两个整数a,b,分别表示该矩阵的行数和列数 ,其中1<a,b<100。 第n+1行是一个矩阵连乘的表达式,由括号与大写字母组成,没有乘号与多余的空格。 如果表达式中没有括号则按照从左到右的顺序计算,输入的括号保证能够配对。 输出 对于每组数据,输出仅一行包含一个整数,即将该矩阵连乘方案需要的数乘次数。 如果运算过程中出现不满足矩阵乘法法则的情况(即左矩阵列数与右矩阵的行数不同), 则输出“error”。 样例输入 3 A 10 100 B 100 5 C 5 50 A(BC) 样例输出 75000*/
--------------------------------------------------------------------------------------------------------------------------------------
5
A 10 100
B 100 5
C 5 50
D 50 2
E 2 100
A(B(C(D(E))))
-------------
185000;;;;;