题目来源:

点击打开链接

题目翻译:

矩阵乘法问题是动态规划的典型例子。

假设你必须评估一个表达式,如A * B * C * D * E,其中A,B,C,D和E是矩阵。由于矩阵乘法是关联的,乘法运算的次序是任意的。但是,所需的基本乘法的数量很大程度上取决于您选择的评估顺序。 例如,设A是50 * 10矩阵,B是10 * 20矩阵,C是20 * 5矩阵。 计算A * B * C有两种不同的策略,即(A * B)* C和A *(B * C)。 第一个需要15000次基本乘法,但第二个只需要3500次。

你的工作是编写一个程序来确定给定评估策略所需的基本乘法的数量。

输入:

输入由两部分组成:矩阵列表和表达式列表。 输入文件的第一行包含一个整数n(1 <= n <= 26),表示第一部分中的矩阵数量。接下来的n行包含一个大写字母,指定矩阵的名称和两个整数,指定矩阵的行数和列数。 输入文件的第二部分严格遵守以下语法:

SecondPart = Line { Line } <EOF>
Line = Expression <CR>
Expression = Matrix | "(" Expression Expression ")"
Matrix = "A" | "B" | "C" | ... | "X" | "Y" | "Z"

输出:

对于在输入文件的第二部分中找到的每个表达式,如果由于不匹配的矩阵导致表达式的评估导致错误,则输出包含单词“error”的一行。否则,按照括号中指定的方式打印一行,其中包含评估表达式所需的基本乘法数。

例子:

输入

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))

输出

0
0
0
error
10000
error
3500
15000
40500
47500
15125

解题:

此题,我用了stack和vector。首先定义一个矩阵结构,此结构包含两个数据:行数和列数。然后定义一个大小为26的矩阵数组,并且按ABC...这样排下去。根据输入改写数组里相应位置的数据;如:输入矩阵A的行列数,则修改vector[0]中的行列数。完成矩阵行列数的存储之后,就用stack来处理计算式子。逐一读取计算式子的字符,遇到字母就进栈,遇到左括号就什么事都不做,遇到右括号就出栈,然后进行计算判断。具体如下:

/*
c++/accepted
*/ #include<iostream>
#include<stack>
#include<string>
#include<vector>
using namespace std; struct rc //定义矩阵结构
{
int r;
int c;
}; int main() {
stack<rc> st1; //栈
vector<rc> vec; //数组
for (int k = 0;k<26;k++) //申请长度为26的矩阵数组
{
rc myrc;
vec.push_back(myrc);
}
int n;
cin >> n;
while (n--)
{
int a, b;
char ch;
cin >> ch; //矩阵名字
cin >> a >> b;
vec[(int)(ch) - 65].r = a; //把行列数存到相应位置的矩阵那,A为vec[0],B为vec[1],以此类推
vec[(int)(ch) - 65].c = b;
}
string s;//输入计算式子
//cin >> s;
while (cin>>s)
{
int num = 0;
if (s.length() == 1)//如果计算式子长度为1,则相乘次数为0
cout << 0 << endl;
else
{
for (int i = 0;i<s.length();i++)
{
if (s[i] >='A'&&s[i]<='Z') //遇到字母就进栈
st1.push(vec[(int)(s[i]) - 65]); else if (s[i] == ')') //遇到右括号,出栈两个
{
rc myrc1 = st1.top();
st1.pop();
rc myrc2 = st1.top();
st1.pop();
if (myrc2.c != myrc1.r)//判断前面矩阵的列数是否等于后面矩阵的行数,如果不等,则error
{
cout << "error" << endl;
num = 0;
break;
}
else //如果相等,就计算相乘次数(前行*前列*后列)
{
num = num + myrc2.r*myrc2.c*myrc1.c; //总次数=现次数+此次计算的次数
myrc2.c = myrc1.c;
rc myrc3;//经过一次计算后的结果矩阵(中间矩阵)
myrc3.r = myrc2.r;
myrc3.c = myrc1.c;
st1.push(myrc3);//把中间矩阵进栈
}
}
else//遇到左括号则什么都不做
;
}
}
if (num > 0) //如果num为0,则可能为错,可能已经输出了(0)
cout << num << endl;
}
return 0;
}

ACM解题之(ZOJ 1094) Matrix Chain Multiplication的更多相关文章

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

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

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

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

  3. Matrix Chain Multiplication[HDU1082]

    Matrix Chain Multiplication Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  4. UVA 442 二十 Matrix Chain Multiplication

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

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

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

  6. UVa442 Matrix Chain Multiplication

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

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

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

  8. 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 ...

  9. 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 ...

随机推荐

  1. ddr3调试经验分享(一)——modelsim实现对vivado中的MIG ddr3的仿真

    Vivado中的MIG已经集成了modelsim仿真环境,是不是所有IP 都有这个福利呢,不知道哦,没空去验证. 第一步:使用vivado中的MIG IP生成一堆东西 ,这个过程自己百度.或者是ug5 ...

  2. 微信错误提示code= -4/微信发送被拒绝

    微信错误提示code= -4/微信发送被拒绝 在做第三方登录时.出现微信授权返回的错误码为:code= -4,原因是由于: (微信开放平台的签名填错了微信平台注冊的签名应该是:使用微信签名工具安卓到手 ...

  3. poj3254 Corn Fields 利用状态压缩求方案数;

    Corn Fields 2015-11-25 13:42:33 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10658   ...

  4. 23:LVS客户端配置脚本案例

    [root@web03 scripts]# cat prevent_arp.sh #!/bin/bash lo_ip=$(ip a s lo|grep "10.0.0.1[3]/32&quo ...

  5. 探讨电子商务新的商业模式O2O

    在当前的市场经济大环境下,电子商务成为了众 多中小企业用以开拓市场的主要工具,成为突破企业管理瓶颈的重要手段.必卖电子商务顾问认为,电子商务应该是是线上业务与线下业务的结合.对于从线下渠道 起家的传统 ...

  6. Prime pair connection (Project Euler 134)

    题目大意: 对于连续的质数$p1$, $p2$, 满足$5 <= p1 <= 1000000$ 求出最小的整数$S$, 它以 $p1$结尾并且能够被$p2$整除. 求$S$的和. 思路: ...

  7. Oracle数据迁移expdp/impdp

    Oracle数据迁移expdp/impdp目的:指导项目侧自行进行简单的数据泵迁移工作. 本文实验环境:Oracle 11.2.0.4,利用数据库自带的scott示例用户进行试验测试. 1.首先需要创 ...

  8. HTML5的兴起与4G网络的出现,能否够终止移动端的持续下滑走向

    HTML5的兴起与4G网络的出现,能否够终止移动端的持续下滑走向. 每当大家谈起互联网的未来的时候,多半谈及的是云.大数据.SAAS.仿佛要将一切摒弃.而当谈起移动互联网的时候.却坚持觉得NATIVE ...

  9. java8 关于日期的处理

    Java8 为我们提供了一种新的日期格式:LocalDate和LocalDateTime 获取当前的时间及前一天时间的方法: import java.time.LocalDateTime; impor ...

  10. <转> 堆和栈的区别

    一.预备知识—程序的内存分配    一个由C/C++编译的程序占用的内存分为以下几个部分    1.栈区(stack)—   由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数 ...