Matrix Chain Multiplication[HDU1082]
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]的更多相关文章
- UVA 442 二十 Matrix Chain Multiplication
Matrix Chain Multiplication Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %l ...
- 例题6-3 Matrix Chain Multiplication ,Uva 442
这个题思路没有任何问题,但还是做了近三个小时,其中2个多小时调试 得到的经验有以下几点: 一定学会调试,掌握输出中间量的技巧,加强gdb调试的学习 有时候代码不对,得到的结果却是对的(之后总结以下常见 ...
- UVa442 Matrix Chain Multiplication
// UVa442 Matrix Chain Multiplication // 题意:输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数.假定A和m*n的,B是n*p的,那么AB是m*p的,乘法 ...
- UVa 442 Matrix Chain Multiplication(矩阵链,模拟栈)
意甲冠军 由于矩阵乘法计算链表达的数量,需要的计算 后的电流等于行的矩阵的矩阵的列数 他们乘足够的人才 非法输出error 输入是严格合法的 即使仅仅有两个相乘也会用括号括起来 并且括号中 ...
- Matrix Chain Multiplication(表达式求值用栈操作)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1082 Matrix Chain Multiplication Time Limit: 2000/100 ...
- 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 ...
- ACM学习历程——UVA442 Matrix Chain Multiplication(栈)
Description Matrix Chain Multiplication Matrix Chain Multiplication Suppose you have to evaluate ...
- 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 ...
- 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 ...
随机推荐
- ubuntu下git输出的颜色变化
(这些文章都是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) 11点进家门,感觉很温暖哦. 以下是如何在用git的时候清晰的看出关键字的方法. $ vim ...
- Linux 怎么重命名多个文件
下面是重命名命令的基本语法. rename [-v -n -f] <pcre> <files> <pcre> 是Perl兼容正则表达式,它表示的是要重命名的文件和该 ...
- 轻松架设时时监控工具Cacti
Cacti是一套基于PHP,MySQL,SNMP及 RRDTool开发的网络流量监测图形分析工具.通过snmpget来获取数据,使用 RRDtool绘画图形,而且你完全可以不需要了解RRDtool复杂 ...
- eclipse加速之禁用JS、jsp等文件的语法验证,eclipsejs
eclipse加速之禁用JS.jsp等文件的语法验证 去除eclipse的JS验证:将windows->preference->Java Script->Validator-> ...
- iOS 中的Push Notifications简单实现(APNS)
Android中的通知只有一种,就是Local Notifications,而iOS中除了Local Notifications外,还有一种Push Notifications.ios的这2种noti ...
- iOS 中的字体预览
要预览iOS的各种字体的效果,可以访问http://iosfonts.com
- Java中的内存分配机制
Java的内存分为两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型变量和对象的引用都在函数的栈内存中分配.当在一个代码块中定义一个变量的时候,java就在栈中为其分配内存,当超过作用域的 ...
- HDU 2.1.7 (求定积分公式)
The area Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- HDU 4334 Trouble (暴力)
Trouble Time Limit: 5000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Submit Statu ...
- 【读书笔记】读《JavaScript模式》 - 对象创建模式
JavaScript是一种简洁明了的语言,其中并没有在其他语言中经常使用的一些特殊语法特征,比如命名空间(namespace).模块(module).包(package).私有属性(private p ...