输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数。如果乘法无法进行,输出error。假定A是m*n矩阵,B是n*p矩阵,那么AB是m*p矩阵,乘法次数为 m*n*p 。如果A的列数不等于B的行数,则乘法无法进行。
个人博客分析:本题的关键是解析表达式。本体的表达式比较简单,可以用一个栈来完成:遇到字母即入栈,遇到右括号时就出栈并计算,然后结果入栈。因为保证输入合法,所以括号无须入栈。(简单的括号表达式可以用栈来解析!)
样例输入:
9 A 50 10 B 10 20 C 20 5 D 30 35 E 35 15 F 15 5 G 5 10 H 10 20 I 20 25 A B C (AA) (AB) (AC) (A(BC)) ((AB)C) (((((DE)F)G)H)I) (D(E(F(G(HI))))) ((D(EF))((GH)I))
样例输出:
0 0 0 error 10000 error 3500 15000 40500 47500 15125
个人博客代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#include <cstdio>
#include <stack>
#include <iostream>
#include <cstring>
using
namespace
std;
//定义矩阵结构体
struct
Matrix{
int
a,b;
Matrix(
int
a=0,
int
b=0):a(a),b(b){}
//初始化
} m[26];
stack<Matrix> s;
int
main(){
int
n;
cin>>n;
for
(
int
i=0;i<n;i++){
string name;
cin>>name;
int
k=name[0]-
'A'
;
cin>> m[k].a >>m[k].b;
}
string expr;
while
(cin>>expr){
int
len=expr.length();
bool
error =
false
;
int
ans=0;
for
(
int
i=0;i<len;i++){
if
(
isalpha
(expr[i])) s.push(m[expr[i]-
'A'
]);
//判断如果是字母就入栈
else
if
(expr[i]==
')'
){
//如果是右括号就计算一次
Matrix m2=s.top();s.pop();
Matrix m1=s.top();s.pop();
if
(m1.b != m2.a ) {error =
true
;
break
;}
ans+=m1.a*m1.b*m2.b;
s.push(Matrix(m1.a,m2.b));
}
}
if
(error)
printf
(
"error\n"
);
else
printf
(
"%d\n"
,ans);
}
return
0;
}
|