题目描述:

  输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数。如果乘法无法进行,输出error。

Sample Input

  1. 9
  2. A 50 10
  3. B 10 20
  4. C 20 5
  5. D 30 35
  6. E 35 15
  7. F 15 5
  8. G 5 10
  9. H 10 20
  10. I 20 25
  11. A
  12. B
  13. C
  14. (AA)
  15. (AB)
  16. (AC)
  17. (A(BC))
  18. ((AB)C)
  19. (((((DE)F)G)H)I)
  20. (D(E(F(G(HI)))))
  21. ((D(EF))((GH)I))

Sample Output

  1. 0
  2. 0
  3. 0
  4. error
  5. 10000
  6. error
  7. 3500
  8. 15000
  9. 40500
  10. 47500
  11. 15125
  12.  
  13. 【题目分析】
  14.  
  15.   用一个栈来完成:遇到字母时入栈,遇到右括号时出栈并计算,然后出栈输出结果。
      矩阵链乘规则:
        A50*10的,B10*20的,C20*5的,则(A(BC))的乘法次数为10*20*5BC的乘法次数) + 50*10*5((A(BC))的乘法次数) = 3500
  16.  
  17. 【代码】
     
  1. #include<cstdio>
  2. #include<stack>
  3. #include<iostream>
  4. #include<string>
  5. using namespace std;
  6.  
  7. //定义结构体
  8. struct Matrix {
  9. int a,b;
  10. //构造函数
  11. Matrix(int a = , int b = ) : a(a),b(b){}
  12. } m[];//声明Matrix实例
  13.  
  14. //定义栈
  15. stack<Matrix> s;
  16.  
  17. int main(){
  18.  
  19. //输入矩阵名和其维度
  20. int n;
  21. cin >> n;
  22. for(int i = ; i < n;i++)
  23. {
  24. string name;
  25. cin >> name;
  26. int k = name[] - 'A';//计算元素与'A'阿斯卡码值的差
  27. cin >> m[k].a >> m[k].b;//通过预定义的结构体,获得输入的矩阵维度
  28. }
  29.  
  30. //输入矩阵链乘表达式
  31. string expr;
  32. while(cin >> expr)
  33. {
  34. int len = expr.length();
  35. bool error = false;
  36. int ans = ;
  37. for(int i = ; i < len; i++){
  38. if(isalpha(expr[i])) s.push(m[expr[i] - 'A']);//判断当前元素是否为字母,则将其对应的矩阵维度压入栈
  39. else if(expr[i] == ')'){
  40. //取出栈顶元素后,并删除
  41. Matrix m2 = s.top(); s.pop();
  42. Matrix m1 = s.top(); s.pop();
  43. if(m1.b != m2.a){error = true; break;}//判断是否符合链乘规则
  44. ans += m1.a * m1.b * m2.b;
  45. s.push(Matrix(m1.a,m2.b));
  46. //链乘规则: A,B,C; (A(BC)) = A(BC) + BC;
  47. }
  48. }
  49. if(error) printf("error\n"); else printf("%d\n",ans);
  50. }
  51. return ;
  52. }
  1. 【总结】
      1.结构体:
        自定义数据类型
  1. /*在c++中struct和类的区别在于struct不能有方法,所有成员是public的*/
  2. struct Movie/*可以指定类型名也可以不指定*/
  3. {
  4. //成员都是public
  5. int ID;
  6. string Name;
  7. } movie; //可以在声明struct的时候声明一个struct实例
  1.  

   2.构造函数:

  1. //每一个对象必须要有相应的构造函数
  2. //若没有显示定义构造函数,系统默认缺省的构造函数。
  3. class A{
  4. float x,y;
  5. public:
  6. A() {} //隐含的缺省的构造函数
  7. void Print(void) {cout << x << "\n" << y <<endl;}
  8. };
  9. //只允许这样定义对象
  10. A a1,a2;

  

   3.C++类构造函数初始化列表

  1. class CExample {
  2. public:
  3. int a;
  4. float b;
  5. //构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。
  6. //显示的初始化类的成员
  7. //构造函数初始化列表
  8. CExample(): a(),b(8.8)
  9. {}
  10.  
  11. //对类的成员赋值,并没有进行显式的初始化
  12. //构造函数内部赋值
  13. CExample()
  14. {
  15. a=;
  16. b=8.8;
  17. }
  18. };

   4. using namespace std;

     std 是一个命名空间不同的命名空间可以有相同的类名被定义。

    比如A B两个班都有叫张三的人,你要使用A班的张三,必然要先指名是A班这个名字空间(namespace),然后你对张三的所有命令才能达到你的预想,不会叫错人 。

  1.  
  1.  
  1.   

【UVa-442】矩阵链乘——简单栈练习的更多相关文章

  1. UVa 442 矩阵链乘(栈)

    Input Specification Input consists of two parts: a list of matrices and a list of expressions. The f ...

  2. UVa 442 Matrix Chain Multiplication(栈的应用)

    题目链接: https://cn.vjudge.net/problem/UVA-442 /* 问题 输入有括号表示优先级的矩阵链乘式子,计算该式进行的乘法次数之和 解题思路 栈的应用,直接忽视左括号, ...

  3. UVA - 442 Matrix Chain Multiplication(栈模拟水题+专治自闭)

    题目: 给出一串表示矩阵相乘的字符串,问这字符串中的矩阵相乘中所有元素相乘的次数. 思路: 遍历字符串遇到字母将其表示的矩阵压入栈中,遇到‘)’就将栈中的两个矩阵弹出来,然后计算这两个矩阵的元素相乘的 ...

  4. UVa 10003 切木棍(区间DP+最优矩阵链乘)

    https://vjudge.net/problem/UVA-10003 题意: 有一根长度为L的棍子,还有n个切割点的位置.你的任务是在这些切割点的位置处把棍子切成n+1部分,使得总切割费用最小.每 ...

  5. COJ 0016 20603矩阵链乘

    传送门:http://oj.cnuschool.org.cn/oj/home/solution.htm?solutionID=35454 20603矩阵链乘 难度级别:B: 运行时间限制:1000ms ...

  6. POJ1260 Pearls(dp,矩阵链乘法)

    题目链接. 题目大意: 给定一个n,和两个序列a[i], p[i]. a[i] 表示需要购买 i品质 的数量,p[i] i 等级的价格. 1.每个品质都会有不同的价格,价格依据品质上升而上升 2.买一 ...

  7. UVA 442 二十 Matrix Chain Multiplication

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

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

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

  9. C++模板实现动态顺序表(更深层次的深浅拷贝)与基于顺序表的简单栈的实现

    前面介绍的模板有关知识大部分都是用顺序表来举例的,现在我们就专门用模板来实现顺序表,其中的很多操作都和之前没有多大区别,只是有几个比较重要的知识点需要做专门的详解. #pragma once #inc ...

随机推荐

  1. 从Config文件中读取节点的配置信息

    下面是web.config中与本内容有关的细节 <appSettings> <add key="servername" value="www" ...

  2. [转载] poll()函数

    原地址:http://baike.baidu.com/view/2997591.htm   poll()函数:这个函数是某些Unix系统提供的用于执行与select()函数同等功能的函数,下面是这个函 ...

  3. Windows 回调监控 <二>

    在之前的文章Windows 回调监控 <一> 总结了关于CreateProcessNotify,CreateProcessNotifyEx和LoadImageNotify一些用法,之后产生 ...

  4. Linux:chmod -R 777 * 是什么意思?

    首先,chmod命令是linux上用于改变权限的命令,-R 是递归遍历子目录,因为你要操作的文件使用的*通配符.777,第一个7代表文件所属者的权限,第二个7代表文件所属者所在组的权限,第三个7代表其 ...

  5. Java:Comparator接口

    public interface Comparator<T> 接口里面的方法 int compare(T o1, T o2) o1 > o2 返回 1 o1 = o2 返回 0 o1 ...

  6. Spring框架学习之第6节

    bean的生命周期 为什么总是一个生命当做一个重点? Servlet –> servlet生命周期 Java对象生命周期 往往笔试,面试总喜欢问生命周期的问题? ①   实例化(当我们的程序加载 ...

  7. PHP组合模式、策略模式

    一.问题 模拟不同课程有不同的收费方式,并且能灵活改变(新增或删减),如讲座可以固定收费也可改为按时收费,研讨会也是. 二.模式简介及关键点 1.在父类代码中使用条件语句是一种退倒,可以用多态来代替条 ...

  8. ajax:$.get()

    提要: $.get("异步文件",数值,回调函数); 加载XML文档 a.xml <?xml version="1.0" encoding="U ...

  9. wordpress学习一: 环境搭建

    原来想单独找个linux的机器搞套完整的环境,机器都找好了,环境搞了半天.搞完后,感觉环境什么的不重要,核心是学好php和wordpress,单独的环境维护还开发成本都不小,所以 还是采用 xampp ...

  10. Fiddler如何抓取使用了SSL或TLS传输的Android App流量

    上篇文章介绍了Burpsuite如何抓取使用了SSL或TLS传输的Android App流量, 那么使用Fiddler的时候其实 也会出现与burpsuite同样的情况,解决方案同样是需要将Fiddl ...