【UVa-442】矩阵链乘——简单栈练习
题目描述:
输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数。如果乘法无法进行,输出error。
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
- 【题目分析】
- 用一个栈来完成:遇到字母时入栈,遇到右括号时出栈并计算,然后出栈输出结果。
矩阵链乘规则:
A是50*10的,B是10*20的,C是20*5的,则(A(BC))的乘法次数为10*20*5(BC的乘法次数) + 50*10*5((A(BC))的乘法次数) = 3500。- 【代码】
- #include<cstdio>
- #include<stack>
- #include<iostream>
- #include<string>
- using namespace std;
- //定义结构体
- struct Matrix {
- int a,b;
- //构造函数
- Matrix(int a = , int b = ) : a(a),b(b){}
- } m[];//声明Matrix实例
- //定义栈
- stack<Matrix> s;
- int main(){
- //输入矩阵名和其维度
- int n;
- cin >> n;
- for(int i = ; i < n;i++)
- {
- string name;
- cin >> name;
- int k = name[] - 'A';//计算元素与'A'阿斯卡码值的差
- cin >> m[k].a >> m[k].b;//通过预定义的结构体,获得输入的矩阵维度
- }
- //输入矩阵链乘表达式
- string expr;
- while(cin >> expr)
- {
- int len = expr.length();
- bool error = false;
- int ans = ;
- for(int i = ; i < len; i++){
- if(isalpha(expr[i])) s.push(m[expr[i] - 'A']);//判断当前元素是否为字母,则将其对应的矩阵维度压入栈
- else if(expr[i] == ')'){
- //取出栈顶元素后,并删除
- Matrix m2 = s.top(); s.pop();
- Matrix m1 = s.top(); s.pop();
- if(m1.b != m2.a){error = true; break;}//判断是否符合链乘规则
- ans += m1.a * m1.b * m2.b;
- s.push(Matrix(m1.a,m2.b));
- //链乘规则: A,B,C; (A(BC)) = A(BC) + BC;
- }
- }
- if(error) printf("error\n"); else printf("%d\n",ans);
- }
- return ;
- }
- 【总结】
1.结构体:
自定义数据类型
- /*在c++中struct和类的区别在于struct不能有方法,所有成员是public的*/
- struct Movie/*可以指定类型名也可以不指定*/
- {
- //成员都是public
- int ID;
- string Name;
- } movie; //可以在声明struct的时候声明一个struct实例
2.构造函数:
- //每一个对象必须要有相应的构造函数
- //若没有显示定义构造函数,系统默认缺省的构造函数。
- class A{
- float x,y;
- public:
- A() {} //隐含的缺省的构造函数
- void Print(void) {cout << x << "\n" << y <<endl;}
- };
- //只允许这样定义对象
- A a1,a2;
3.C++类构造函数初始化列表
- class CExample {
- public:
- int a;
- float b;
- //构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。
- //显示的初始化类的成员
- //构造函数初始化列表
- CExample(): a(),b(8.8)
- {}
- //对类的成员赋值,并没有进行显式的初始化
- //构造函数内部赋值
- CExample()
- {
- a=;
- b=8.8;
- }
- };
4. using namespace std;
std 是一个命名空间不同的命名空间可以有相同的类名被定义。
比如A B两个班都有叫张三的人,你要使用A班的张三,必然要先指名是A班这个名字空间(namespace),然后你对张三的所有命令才能达到你的预想,不会叫错人 。


【UVa-442】矩阵链乘——简单栈练习的更多相关文章
- UVa 442 矩阵链乘(栈)
Input Specification Input consists of two parts: a list of matrices and a list of expressions. The f ...
- UVa 442 Matrix Chain Multiplication(栈的应用)
题目链接: https://cn.vjudge.net/problem/UVA-442 /* 问题 输入有括号表示优先级的矩阵链乘式子,计算该式进行的乘法次数之和 解题思路 栈的应用,直接忽视左括号, ...
- UVA - 442 Matrix Chain Multiplication(栈模拟水题+专治自闭)
题目: 给出一串表示矩阵相乘的字符串,问这字符串中的矩阵相乘中所有元素相乘的次数. 思路: 遍历字符串遇到字母将其表示的矩阵压入栈中,遇到‘)’就将栈中的两个矩阵弹出来,然后计算这两个矩阵的元素相乘的 ...
- UVa 10003 切木棍(区间DP+最优矩阵链乘)
https://vjudge.net/problem/UVA-10003 题意: 有一根长度为L的棍子,还有n个切割点的位置.你的任务是在这些切割点的位置处把棍子切成n+1部分,使得总切割费用最小.每 ...
- COJ 0016 20603矩阵链乘
传送门:http://oj.cnuschool.org.cn/oj/home/solution.htm?solutionID=35454 20603矩阵链乘 难度级别:B: 运行时间限制:1000ms ...
- POJ1260 Pearls(dp,矩阵链乘法)
题目链接. 题目大意: 给定一个n,和两个序列a[i], p[i]. a[i] 表示需要购买 i品质 的数量,p[i] i 等级的价格. 1.每个品质都会有不同的价格,价格依据品质上升而上升 2.买一 ...
- 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调试的学习 有时候代码不对,得到的结果却是对的(之后总结以下常见 ...
- C++模板实现动态顺序表(更深层次的深浅拷贝)与基于顺序表的简单栈的实现
前面介绍的模板有关知识大部分都是用顺序表来举例的,现在我们就专门用模板来实现顺序表,其中的很多操作都和之前没有多大区别,只是有几个比较重要的知识点需要做专门的详解. #pragma once #inc ...
随机推荐
- 从Config文件中读取节点的配置信息
下面是web.config中与本内容有关的细节 <appSettings> <add key="servername" value="www" ...
- [转载] poll()函数
原地址:http://baike.baidu.com/view/2997591.htm poll()函数:这个函数是某些Unix系统提供的用于执行与select()函数同等功能的函数,下面是这个函 ...
- Windows 回调监控 <二>
在之前的文章Windows 回调监控 <一> 总结了关于CreateProcessNotify,CreateProcessNotifyEx和LoadImageNotify一些用法,之后产生 ...
- Linux:chmod -R 777 * 是什么意思?
首先,chmod命令是linux上用于改变权限的命令,-R 是递归遍历子目录,因为你要操作的文件使用的*通配符.777,第一个7代表文件所属者的权限,第二个7代表文件所属者所在组的权限,第三个7代表其 ...
- Java:Comparator接口
public interface Comparator<T> 接口里面的方法 int compare(T o1, T o2) o1 > o2 返回 1 o1 = o2 返回 0 o1 ...
- Spring框架学习之第6节
bean的生命周期 为什么总是一个生命当做一个重点? Servlet –> servlet生命周期 Java对象生命周期 往往笔试,面试总喜欢问生命周期的问题? ① 实例化(当我们的程序加载 ...
- PHP组合模式、策略模式
一.问题 模拟不同课程有不同的收费方式,并且能灵活改变(新增或删减),如讲座可以固定收费也可改为按时收费,研讨会也是. 二.模式简介及关键点 1.在父类代码中使用条件语句是一种退倒,可以用多态来代替条 ...
- ajax:$.get()
提要: $.get("异步文件",数值,回调函数); 加载XML文档 a.xml <?xml version="1.0" encoding="U ...
- wordpress学习一: 环境搭建
原来想单独找个linux的机器搞套完整的环境,机器都找好了,环境搞了半天.搞完后,感觉环境什么的不重要,核心是学好php和wordpress,单独的环境维护还开发成本都不小,所以 还是采用 xampp ...
- Fiddler如何抓取使用了SSL或TLS传输的Android App流量
上篇文章介绍了Burpsuite如何抓取使用了SSL或TLS传输的Android App流量, 那么使用Fiddler的时候其实 也会出现与burpsuite同样的情况,解决方案同样是需要将Fiddl ...