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 ...
随机推荐
- Nmap备忘单:从探索到漏洞利用(Part3)
众所周知NMAP是经常用来进行端口发现.端口识别.除此之外我们还可以通过NMAP的NSE脚本做很多事情,比如邮件指纹识别,检索WHOIS记录,使用UDP服务等. 发现地理位置 Gorjan Petro ...
- 【OpenStack】OpenStack系列16之OpenStack镜像制作
参考 参考: https://www.google.com.hk/?gws_rd=ssl#safe=strict&q=openstack+img+%E5%88%B6%E4%BD%9C http ...
- 【Spring】Spring系列3之Spring AOP
3.Spring AOP 3.1.AOP概述 3.2.前置通知 3.3.后置通知 3.4.返回通知.异常通知.环绕通知 3.5.指定切面优先级 3.6.重用切入点表达式 3.7.引入通知 3.8.基于 ...
- 《ASP.NET1200例》当前上下文中不存在名称configurationmanager
当前上下文中不存在名称ConfigurationManager的解决方法 今晚做项目在DBHelper.cs类中的数据库连接要改到web.config里面调用,结果在编译的时候却发现提示错误: 当前上 ...
- Longest Consecutive Sequence
Given an unsorted array of integers, find the length of the longest consecutive elements sequence. C ...
- Mysql数据库中设置root密码的命令及方法
我们都知道通常PHP连接 Mysql都是通过root用户名和密码连接,默认情况下在Mysql安装时root初始密码为空,在安装使用PHP开源系统时,都需要填写连接Mysql数据库的用户名和密码,此时当 ...
- iOS 的UIWindow 类研究
今日发现如果想做出漂亮的界面效果,就需要仔细研究一下UIWindow这个类.现在还不清楚为什么要有这么一个UIWindow类,它跟UIView的根本区别是什么?和Android中的什么类比较相像.先做 ...
- iOS category中的所谓属性 和 从xib初始化对象的方法 以及类扩展
今天在编码时遇到以下代码 @interface UITextField (TCCustomFont) @property (nonatomic, copy) NSString* fontName; @ ...
- Java for LeetCode 044 Wildcard Matching
Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single character. ...
- elk+redis分布式分析nginx日志
一.elk套件介绍 ELK 由 ElasticSearch . Logstash 和 Kiabana 三个开源工具组成.官方网站: https://www.elastic.co/products El ...