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.
SecondPart = Line { Line }Line = Expression Expression = Matrix | "(" Expression Expression ")" Matrix = "A" | "B" | "C" | ... | "X" | "Y" | "Z"
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
#include
struct Matrice
{
int used;
int x;
int y;
};
struct Matrice Matrices[27];
struct Matrice Resolve(char** Line, int* value)
{
char* p = *Line;
int v1, v2;
struct Matrice M1, M2;
if(*p != '('){
*value = 0;
*Line = *Line + 1;
return Matrices[*p-'A'];
}
p++;
M1 = Resolve(&p, &v1);
M2 = Resolve(&p, &v2);
p++;
*Line = p;
if(v1 == -1 || v2 == -1) *value = -1;
else{
if(M1.y == M2.x) *value = M1.x * M1.y * M2.y + v1 + v2;
else *value = -1;
}
M1.y = M2.y;
return M1;
}
int main()
{
int MatriceCount, i, x, y, value;
char ch, Line[256], *p;
for(ch = 'A'; ch <= 'Z'; ch++) Matrices[ch-'A'].used = 0;
scanf("%d/n", &MatriceCount);
for(i = 0; i < MatriceCount; i++){
scanf("%c%d%d/n", &ch, &x, &y);
Matrices[ch-'A'].used = 1;
Matrices[ch-'A'].x = x;
Matrices[ch-'A'].y = y;
}
while(gets(Line)){
p = Line;
Resolve(&p, &value);
if(value == -1) printf("error/n");
else printf("%d/n", value);
}
return 0;
}
Run time: 00:00.00
Run memory: 388K