Matrix Chain Multiplication

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 834    Accepted Submission(s): 570

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

Source
University of Ulm Local Contest 1996

A cost of one multiplication is r1*c1*c2.The qualification of two matrices which can multiply is c1==r2.
In this exercise,the main bother is how to deal with parentheses.I think this is tedious,so I use Depth_Priority_Search.

#include<stdio.h>
#include<string.h>
char str[1500],ch;
int row[256],col[256];
class node
{
public:
int ro,co,ans;
};
int match(int x)
{
int lnum=1,rnum=0,i;
for (i=x+1;i<strlen(str);i++)
{
if (str[i]=='(') lnum++;
if (str[i]==')') rnum++;
if (lnum==rnum) return i;
}
}
int find(int l,int r)
{
int i;
for (i=l;i<=r;i++)
if (str[i]=='(') return i;
return -1;
}
node dfs(int l,int r)
{
node ret;
if (l+1==r && str[l]=='(' && str[r]==')')
{
ret.ans=0;
return ret;
}
if (str[l]=='(')
{
int m=match(l);
if (m==r) return dfs(l+1,r-1);
node lans=dfs(l+1,m-1),rans=dfs(m+1,r);
if (lans.ans==-1 || rans.ans==-1 || lans.co!=rans.ro)
{
ret.ans=-1;
return ret;
}
ret.ans=lans.ans+rans.ans+lans.ro*lans.co*rans.co;
ret.ro=lans.ro;ret.co=rans.co;
return ret;
}
int p=find(l,r);
if (p>=0)
{
node lans=dfs(l,p-1),rans=dfs(p,r);
if (lans.ans==-1 || rans.ans==-1 || lans.co!=rans.ro)
{
ret.ans=-1;
return ret;
}
ret.ans=lans.ans+rans.ans+lans.ro*lans.co*rans.co;
ret.ro=lans.ro;ret.co=rans.co;
return ret;
}
int i,ro=row[str[l]],co=col[str[l]];
ret.ans=0;
ret.ro=row[str[l]];
ret.co=col[str[r]];
for (i=l+1;i<=r;i++)
{
if (co!=row[str[i]])
{
ret.ans=-1;
return ret;
}
ret.ans+=ro*co*col[str[i]];
}
return ret;
}
int main()
{
int i,N;
scanf("%d",&N);
ch=getchar();
for (i=1;i<=N;i++)
{
scanf("%c",&ch);
scanf("%d%d",&row[ch],&col[ch]);
ch=getchar();
}
while (scanf("%s",str)!=EOF)
{
int l=0,r=strlen(str)-1;
node ret=dfs(l,r);
if (ret.ans==-1) printf("error\n");
else printf("%d\n",ret.ans);
}
return 0;
}

Matrix Chain Multiplication[HDU1082]的更多相关文章

  1. UVA 442 二十 Matrix Chain Multiplication

    Matrix Chain Multiplication Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %l ...

  2. 例题6-3 Matrix Chain Multiplication ,Uva 442

    这个题思路没有任何问题,但还是做了近三个小时,其中2个多小时调试 得到的经验有以下几点: 一定学会调试,掌握输出中间量的技巧,加强gdb调试的学习 有时候代码不对,得到的结果却是对的(之后总结以下常见 ...

  3. UVa442 Matrix Chain Multiplication

    // UVa442 Matrix Chain Multiplication // 题意:输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数.假定A和m*n的,B是n*p的,那么AB是m*p的,乘法 ...

  4. UVa 442 Matrix Chain Multiplication(矩阵链,模拟栈)

    意甲冠军  由于矩阵乘法计算链表达的数量,需要的计算  后的电流等于行的矩阵的矩阵的列数  他们乘足够的人才  非法输出error 输入是严格合法的  即使仅仅有两个相乘也会用括号括起来  并且括号中 ...

  5. Matrix Chain Multiplication(表达式求值用栈操作)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1082 Matrix Chain Multiplication Time Limit: 2000/100 ...

  6. UVA——442 Matrix Chain Multiplication

    442 Matrix Chain MultiplicationSuppose you have to evaluate an expression like A*B*C*D*E where A,B,C ...

  7. ACM学习历程——UVA442 Matrix Chain Multiplication(栈)

    Description   Matrix Chain Multiplication  Matrix Chain Multiplication  Suppose you have to evaluate ...

  8. uva-442 Matrix Chain Multiplication

    Suppose you have to evaluate an expression like A*B*C*D*E where A,B,C,D and E are matrices. Since ma ...

  9. Matrix Chain Multiplication UVA - 442

    Suppose you have to evaluate an expression like ABCDE where A,B,C,D and E are matrices. Since matrix ...

随机推荐

  1. HDU 1176免费馅饼 DP数塔问题转化

    L - 免费馅饼 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Sta ...

  2. [颓废] 改某人的WebGL light mapping demo并9xSSAA

    渲染图(4k) 链接: http://pan.baidu.com/s/1bnB4Wqz 密码: 8839 2px高斯模糊+立方缩小AA:  链接: http://pan.baidu.com/s/1mg ...

  3. 12 day 1

    #include <cstdio> int i,j,m,n,t; long long f[6000][6000]; inline int min(int a,int b){ return ...

  4. Java和PyPy速度对比

    Java和PyPy运行同一段代码,对比结果. Java代码: package javatest; import java.text.DecimalFormat; import java.util.Da ...

  5. Windows命令行重命名文件

    RENAME D:\Cache\xyz.html xyz%date:~0,4%%date:~5,2%%date:~8,2%.tar.gz

  6. 对于sharepoint 的解决方案的实际说明

    对于sharepoint 的解决方案  实际上就是cab的包 你把***.wsp改为***.cab我们就可以查看这个包中的所有内容了

  7. Android PullToRefreshListView上拉刷新和下拉刷新

    PullToRefreshListView实现上拉和下拉刷新有两个步骤: 1.设置刷新方式 pullToRefreshView.setMode(PullToRefreshBase.Mode.BOTH) ...

  8. mysql update case when和where之间的注意事项

    在日常开发中由于业务逻辑较为复杂,常常需要用到UPDATE和CASE...WHEN...THEN...ELSE...END一起做一些复杂的更新.有时候因为对这几个字句理解得不透彻会带来很大的困扰.因此 ...

  9. DFS:Lake Counting(POJ 2386)

    好吧前几天一直没更新博客,主要是更新博客的确是要耗费一点精力 北大教你数水坑 最近更新博客可能就是一点旧的东西和一些水题,主要是最近对汇编感兴趣了嘻嘻嘻 这一题挺简单的,没什么难度,简单深搜 #inc ...

  10. BSD学习(BSD系统的历史和目标)

    UNIX系统的历史 unix系统的发展历程大概经历以下几个阶段: 贝尔实验室(Bell Laboratories)阶段,该实验室发明了UNIX 加州大学伯克利分校(University of Cali ...