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 ...
随机推荐
- ZeroMQ安装
一.ZeroMQ介绍 ZeroMQ是一个开源的消息队列系统,按照官方的定义,它是一个消息通信库,帮助开发者设计分布式和并行的应用程序. 首先,我们需要明白,ZeroMQ不是传统的消息队列系统(比如Ac ...
- 三款SDR平台对比:HackRF,bladeRF和USRP
这篇文章是Taylor Killian今年8月发表在自己的博客上的.他对比了三款平价的SDR平台,认为这三款产品将是未来一年中最受欢迎的SDR平台.我觉得这篇文章很有参考价值,简单翻译一份转过来.原文 ...
- Django中如何查找模板
参考:http://my.oschina.net/zuoan001/blog/188782 Django的setting中有关找模板的配置有如下两个: TEMPLATE_LOADERS TEMPLAT ...
- 38.输出1到最大的N位数[Print 1 to max number of N bits]
[题目] 输入数字n,按顺序输出从1最大的n位10进制数.比如输入3,则输出1.2.3一直到最大的3位数即999. [分析] 这是一道很有意思的题目.看起来很简单,其实里面却有不少的玄机. [常规思路 ...
- 17.把字符串转换成整数[atoi]
[题目] 把字符串转换成整数,需要考虑字符串有效性. [代码] C++ Code 123456789101112131415161718192021222324252627282930313233 ...
- Java for LeetCode 045 Jump Game II
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- CocoaPods报错及解决方法记录
[!] Oh no, an error occurred. Search for existing GitHub issues similar to yours: https://github.com ...
- cf112a(水题)
题目很简单..不过题意好像有点难懂... 题意:判定一个数能否被一个幸运数整除,循环一遍4到n/4,若存在i为幸运数且被n整除输出yes,反之输出no... 代码如下: #include <bi ...
- WebService之CXF框架
本文主要包括以下内容 ant工具的使用 利用cxf实现webservice cxf与spring整合 ajax访问webservice ant 工具 1.为什么要用到ant这个工具呢? Ant做为一种 ...
- hdu 1016 Prime Ring Problem(DFS)
Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...