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 ...
随机推荐
- retain copy(浅复制) mutablecopy (深复制)
http://blog.csdn.net/xdrt81y/article/details/24331103 口诀: 1浅3深 NSArray copy (浅) 返回NSArray NSArra ...
- delphi 2007 远程调试
Remote debugging lets you debug a RAD Studio application running on a remote computer. Once the remo ...
- .Net Attribute特性
1.什么是Atrribute 首先,我们肯定Attribute是一个类,下面是msdn文档对它的描述: 公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标 ...
- Linux匿名管道与命名管道
http://blog.chinaunix.net/uid-26000296-id-3408970.html /* * \File * main.c * \Descript * father-proc ...
- 5.前端笔记之jquery部分
一.简介 jQuery是一个兼容多浏览器的javascript库,核心理念是write less,do more(写得更少,做得更多).jQuery在2006年1月由美国人John Resig在纽约的 ...
- 【贪心】最大乘积-贪心-高精度-java
问题 G: [贪心]最大乘积 时间限制: 1 Sec 内存限制: 128 MB提交: 34 解决: 10[提交][状态][讨论版] 题目描述 一个正整数一般可以分为几个互不相同的自然数的和,如3 ...
- hdu 1272 小希的迷宫 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272 第二条并查集,和畅通工程的解法类似.判断小希的迷宫不符合条件,即有回路.我的做法是,在合并两个集 ...
- mysql生成varchar类型主键排序
用uuid生成20位的主键 SELECT LEFT(REPLACE(UUID(), '-', ''),20) FROM DUAL 另一种方法: 因为数据库中有字母 需要排序的时候去除字母,重新取最大值 ...
- 爱改名的小融 2(codevs 3149)
3149 爱改名的小融 2 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description Wikioi上有个人 ...
- 矩阵按键的试验---verilog
矩阵键盘的试验,采用三段式状态机处理方法. 难点在于检测状态机中:按键消抖以后逐列检测. 电路图: 代码 /********************************Copyright***** ...