励志用尽量少的代码做高效的表达。


题目(提交)链接→UVa-442


储备知识:

矩阵相乘次数:


如图:A矩阵*B矩阵得到C矩阵。 C矩阵中元素个数=A矩阵行数*B矩阵列数。得到C矩阵中任意元素都需要运算A矩阵的列数次。
因此,总运算次数为:A矩阵行数*B矩阵列数*A矩阵列数(B矩阵行数)=2*2*3=12次。

同理:求A(BC)的运算次数:
设BC矩阵相乘后得D矩阵。
则总次数=BC相乘后的次数+AD相乘后的次数。


思路:

正常的解析表达式类型题直接用字母运算,但本题每个字母对应不同的矩阵。因此本题实质为解析表达式+字符映射矩阵。采用stack<int>s存储字母(解析表达式);采用map<char, pair<int, int>>m 分别存储字符、矩阵的行和列(字母映射矩阵)
实现过程:遍历输入序列,若为字母则压入栈。 若为右括号,则连续弹出两个栈顶元素做运算, 乘法次数累加至sum中。 本次运算完成后, 建立关于map的新字母映射,存入map(map有去重功能,如果不是新字母映射,会自动删去), 同时将新字母压入栈。 继续遍历。

注意:

1、栈弹出的顺序与输入的顺序相反,判断行列相等时不要弄反了。
2、因为输入保证合法,括号无需入栈。

代码:

#include<bits/stdc++.h>                          //万能头文件
using namespace std;
int main() {map<char,pair<int, int> >m;int n; cin >> n; int n1 = n;while(n--) {                                  //构建map映射char ch; cin >> ch;                      //输入字母cin >> m[ch].first >> m[ch].second;           //输入矩阵的行、列数} string s; while(cin >> s) {                      //输入表达式bool flag = false;                          //做最后的输出判断。stack<int>ss; int len = s.length(), sum = 0;             //sum为乘法次数累加for(int i = 0; i < len; i++) {                //遍历表达式if(isalpha(s[i])) ss.push(s[i]);     //如果是字母,则压入栈 else if(s[i] == ')') {                  //若为右括号,则弹出两个字母做运算 char b = ss.top(); ss.pop();     char a = ss.top(); ss.pop();if(m[b].first == m[a].second) {      //运算过程 sum += m[a].first*m[b].second*m[a].second; //计算乘法次数 m['A'+n1].first = m[a].first;  //建立新字母,新映射 m['A'+n1].second = m[b].second;  ss.push((char)('A'+n1++));     //新字母入栈 } else { cout << "error\n"; flag = !flag; break; }}}if(!flag) cout << sum << '\n';}return 0;
}

收获:

1、对栈解“解析表达式”更熟练。
2、对map映射运用更加灵活。


择苦而安,择做而乐。虚拟现实终究比不过真实精彩之万一。

30行代码AC——例题6-3 矩阵链乘(Maxtrix Chain Multiplication, UVa 442)——解题报告相关推荐

  1. 高效万进制——蓝桥杯|HDOJ 1002 大数加法——30行代码AC

    浅谈进制思想: 日常生活中我们习惯用十进制去运算: 为了方便电脑识别开发出了二进制,又因为2^3=8 , 2^4=16,因此应运而生了八进制与16进制. 世上本没有路,走的人多了,也便成了路,那么既然 ...

  2. 16行代码AC——例题6-4破损的键盘(Broken Keyboard,UVa 11988)——解题报告

    励志用尽量少的代码做高效的表达. 题目(提交)链接→UVa-11988 题目大意: 输入一个字符串,输出在原本应该是怎么样的? 具体方法是: 若读取到'[', 则执行Home键:将光标移到行首. 若读 ...

  3. 21行代码AC——例题5-2 Ducci序列(Ducci Sequence,UVa1594)——解题报告

    励志用少的代码做高效的表达. 题目(提交)链接→UVa-1594 本题为水题,因此侧重点从解题转变为优化. 注意点: 1.下一轮是按照上一轮的每个数做运算,但下一轮每次运算都会改变数列的值,造成运算不 ...

  4. 12行代码AC——例题6-6 小球下落(Droppint Balls, UVa 679)——解题报告

    励志用尽量少的代码做高效的表达. 提交(题目)链接→UVa-679 题目大意: 有一颗满二叉树,每个节点是一个开关,初始全是关闭的,小球从顶点落下,如果开关打开,则落向该节点的右子树,如果开关关闭,则 ...

  5. 19行代码AC——例题 6-2 铁轨(Rails, UVa 514)——解题报告

    励志用尽量少的代码做高效的表达. 提交(题目)链接→UVa-514 此题的本质是:给出"入栈顺序",判断给定序列是否可以出栈. 有点像这种题: 因此思路也类似: 思路: 数组存储列 ...

  6. 22行代码AC——例题7-1除法(Division UVa 725)——解题报告

    励志用尽量少的代码做高效的表达 题目(提交)链接→UVa-725 题目大意: 0-9不重复的组成两个5位数,如果数A/数B=n,则为可行解. 思路分析: 本题实质是通过巧妙分析的暴力求解法. 下等解法 ...

  7. 43行代码AC——例题6-8 树(Tree,UVa 548)——解题报告

    励志用尽量少的代码做高效的表达. You are to determine the value of the leaf node in a given binary tree that is the ...

  8. 33行代码AC——例题6-5 移动盒子(Boxes in a Line, UVa 12657)——解题报告

    题目大意 对升序排列的n个数字(1开始编号)进行一系列操作,输出最终序列的奇位数之和.操作如下: 1 X Y:把X移到Y左侧 2 X Y:把X移到Y右侧 3 X Y:交换X和Y 4:反转序列(逆置) ...

  9. 比紫书优化,14行代码AC——例题 5-7 丑数(Ugly Numbers,UVa 136)——解题报告

    题意: 丑数是一些因子只有2,3,5的数.数列1,2,3,4,5,6,8,9,10,12,15--写出了从小到大的前11个丑数,1属于丑数.现在请你编写程序,找出第1500个丑数是什么. 没有输入 输 ...

最新文章

  1. C++项目中的extern C {}
  2. Android BaseAdapter 例子
  3. [学习笔记]电磁场与电磁波
  4. HDU 1506 Largest Rectangle in a Histogram(dp、单调栈)
  5. easyui扩展-日期范围选择.
  6. Object 对象详解
  7. vue delete删除json数组_Vue.set 和 Vue.delete
  8. SQLServer2008数据库还原失败 恢复失败
  9. python怎样装pandas_小白学python:坑一:如何安装pandas和numpy
  10. Java List集合实现倒倒序排列
  11. 车辆出厂信息接口_最新10项中标招标信息汇总2020.12.7
  12. 和程序员男友过节是这样的
  13. php货币2019年12月31日汇率,[外汇]2019年12月31日人民币汇率中间价新公告 今日美元兑人民币行情查询 - 南方财富网...
  14. 朋友圈投票活动-刷票案例实现与分析
  15. python入门——热量转换 I
  16. Python异常及处理
  17. 2020-11-05T09:00:00+08:00 类型的时间格式化处理(时间转换)
  18. PhotoShop如何去除图片上的污点、水印
  19. 论文理解 A Survey on Trajectory-Prediction Methods for Autonomous Driving
  20. Oracle 数据库自动诊断库 ADR(Automatic Diagnostic Repository)简介 发表在 数据和云

热门文章

  1. 使用Maven archetype 自定义项目脚手架
  2. 每个人都有自己的人生节奏
  3. 图文详解CDC技术,看这一篇就够了!
  4. 面试题鬼的很:Class.forName 和 ClassLoader 有什么区别?
  5. 跟着邓神 3 天掌握 Go 语言基础(免费)
  6. 新的Azure通信服务(ACS)如何实现WebRTC?
  7. 保25ms争10ms——Zenlayer如何保持出海业务的超低延时
  8. Golang 编程思维和工程实战
  9. 腾讯游戏自研学术成果:基于图分割的网络表征学习初始化技术
  10. 腾讯Angel亮相VLDB,携全新Angel 2.0宣布加入LF深度学习基金会