ZZULI 1618 (HDU 1082)Matrix Ch…
2012-12-05 17:15
330 查看
Matrix Chain
Multiplication
Time Limit:1000MS Memory Limit:65536KTotal Submit:8 Accepted:2
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 }Line = ExpressionExpression = 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
Sample
Output
Source
用栈,原来做过的不知道比赛的时候怎么想的,就不会做了……
代码:
#include<stdio.h>
struct multipl{ int
col,row;}map[27];int top,stack_col[27],stack_row[27];
int match(int a,int b){
if(stack_col[a] == stack_row[b])
return 0; return
1;}
int Isalpha(char a){
if(a>='A'&&a<='Z')
return 1; return
0;}
int main(){ int
num,n,b,c,i; char
str[1000],word;
scanf("%d",&n);
while(n--){
getchar();
scanf("%c
%d%d",&word,&b,&c);
map[word-'A'].col=c;
map[word-'A'].row=b; }
getchar();
while(gets(str)){
num=0;top=0;
for(i=0;str[i];i++)
{
if(Isalpha(str[i]))
{
stack_col[top]=map[str[i]-'A'].col;
stack_row[top++]=map[str[i]-'A'].row;
}
else if(str[i]==')')
{
if(match(top-2,top-1))
break;
num+=stack_row[top-2]*stack_col[top-2]*stack_col[top-1];
stack_col[top-2]=stack_col[top-1];
top--;
}
}
Multiplication
Time Limit:1000MS Memory Limit:65536KTotal Submit:8 Accepted:2
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 }Line = ExpressionExpression = 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
Sample
Output
Source
用栈,原来做过的不知道比赛的时候怎么想的,就不会做了……
代码:
#include<stdio.h>
struct multipl{ int
col,row;}map[27];int top,stack_col[27],stack_row[27];
int match(int a,int b){
if(stack_col[a] == stack_row[b])
return 0; return
1;}
int Isalpha(char a){
if(a>='A'&&a<='Z')
return 1; return
0;}
int main(){ int
num,n,b,c,i; char
str[1000],word;
scanf("%d",&n);
while(n--){
getchar();
scanf("%c
%d%d",&word,&b,&c);
map[word-'A'].col=c;
map[word-'A'].row=b; }
getchar();
while(gets(str)){
num=0;top=0;
for(i=0;str[i];i++)
{
if(Isalpha(str[i]))
{
stack_col[top]=map[str[i]-'A'].col;
stack_row[top++]=map[str[i]-'A'].row;
}
else if(str[i]==')')
{
if(match(top-2,top-1))
break;
num+=stack_row[top-2]*stack_col[top-2]*stack_col[top-1];
stack_col[top-2]=stack_col[top-1];
top--;
}
}
相关文章推荐
- HDU 1051(ZZULI 1609) Wooden St…
- UVa 442 && HDU 1082 Matrix Chain Multiplication【栈】
- ZZULI_SummerPractice(3) HDU 1…
- HDU 4160 (ZZULI 1598) Dolls(二分…
- ZZULI_SummerPractice(6) HDU 390…
- ZZULI_TEAM_PRACTICE(1) HDU 1251…
- ZZULI 1616(POJ 2243||HDU 1372)…
- ZZULI_TEAM_PRACTICE(1) HDU 1212…
- ZZULI 1617 (HDU 1686)Oulipo (…
- ZZULI 1619 (HDU 2647) Reward …
- UVa 442/HDU 1082/ZOJ 1094 Matrix Chain Multiplication(模拟&栈)
- HDU 3123(ZZULI 1605) GCC(递推) …
- HDU Leftmost Digit
- hdu 1874 畅通工程续(最短路径)
- hdu 2393 Higher Math
- hdu 1317 XYZZY
- hdu 1688 Sightseeing
- HDU 2710 Max Factor
- HDU 2098 分拆素数和
- 【HDU】 1466 计算直线交点…