原题点此
Matrix Chain Multiplication
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2313 Accepted Submission(s): 1406
Problem Description
Matrix multiplication problem is a typical example of dynamical programming.
Suppose you have to evaluate an expression like A*B*C*D*E where A,B,C,D and E are matrices. Since matrix multiplication is associative, the order in which multiplications are performed is arbitrary. However, the number of elementary multiplications needed strongly depends on the evaluation order you choose.
For example, let A be a 50*10 matrix, B a 10*20 matrix and C a 20*5 matrix.
There are two different strategies to compute A*B*C, namely (A*B)*C and A*(B*C).
The first one takes 15000 elementary multiplications, but the second one only 3500.
Your job is to write a program that determines the number of elementary multiplications needed for a given evaluation strategy.
Input
Input consists of two parts: a list of matrices and a list of expressions.
The first line of the input file contains one integer n (1 <= n <= 26), representing the number of matrices in the first part. The next n lines each contain one capital letter, specifying the name of the matrix, and two integers, specifying the number of rows and columns of the matrix.
The second part of the input file strictly adheres to the following syntax (given in EBNF):
SecondPart = Line { Line } <EOF>
Line = Expression <CR>
Expression = Matrix | "(" Expression Expression ")"
Matrix = "A" | "B" | "C" | ... | "X" | "Y" | "Z"
Output
For each expression found in the second part of the input file, print one line containing the word "error" if evaluation of the expression leads to an error due to non-matching matrices. Otherwise print one line containing the number of elementary multiplications needed to evaluate the expression in the way specified by the parentheses.
Sample Input
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))
Sample Output
0
0
0
error
10000
error
3500
15000
40500
47500
15125
题意:每一个大写字母代表一个矩阵,给出矩阵的行和列,要求计算每一个类似表达式 “(AB)” 的计算次数
思路:用栈来实现该计算,遇到字母则入栈,遇到 ' ) '计算一次,取两次栈顶元素,并把乘完后所得新的矩阵压入栈,重复此操作得总的次数。
参考代码:
#include <iostream>
#include <cstdio>
#include <stack>
#include <string>
using namespace std;
struct Matrix
{
int a,b;
};
stack<Matrix> s;
int main()
{
//freopen("in.txt","r",stdin);
// freopen("out.txt","r",stdout);
Matrix m[26];
int n,c1,c2,r1,r2,summ,flag;
char name;
scanf("%d",&n);
//getchar();
while(n--)//输入
{
cin>>name;
//scanf("%c",&name); 若要用scanf正确输入name的值,则需要每用一次scanf后用getchar()将残余字符清掉
//getchar();
scanf("%d%d",&m[name-'A'].a,&m[name-'A'].b);
//getchar();
}
string s1;
while(cin>>s1)
{
Matrix neww;
summ=0;
flag=1;
if(s1.length()==1)
{
printf("0\n");
continue;
}
for(int i=0; i<s1.length(); i++)
{
if(isalpha(s1[i]))
s.push(m[s1[i]-'A']);
else if(s1[i]==')')
{
r2=s.top().a;//此处注意先出栈的是AB中的B矩阵
c2=s.top().b;
s.pop();
r1=s.top().a;
c1=s.top().b;
s.pop();
if(c1!=r2)
{
printf("error\n");
flag=0;
break;
}
neww.a=r1;
neww.b=c2;
s.push(neww);
summ+=c1*r1*c2;
}
}
if(flag)
printf("%d\n",summ);
}
}