30行代码AC——例题6-3 矩阵链乘(Maxtrix Chain Multiplication, UVa 442)——解题报告
励志用尽量少的代码做高效的表达。
题目(提交)链接→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)——解题报告相关推荐
- 高效万进制——蓝桥杯|HDOJ 1002 大数加法——30行代码AC
浅谈进制思想: 日常生活中我们习惯用十进制去运算: 为了方便电脑识别开发出了二进制,又因为2^3=8 , 2^4=16,因此应运而生了八进制与16进制. 世上本没有路,走的人多了,也便成了路,那么既然 ...
- 16行代码AC——例题6-4破损的键盘(Broken Keyboard,UVa 11988)——解题报告
励志用尽量少的代码做高效的表达. 题目(提交)链接→UVa-11988 题目大意: 输入一个字符串,输出在原本应该是怎么样的? 具体方法是: 若读取到'[', 则执行Home键:将光标移到行首. 若读 ...
- 21行代码AC——例题5-2 Ducci序列(Ducci Sequence,UVa1594)——解题报告
励志用少的代码做高效的表达. 题目(提交)链接→UVa-1594 本题为水题,因此侧重点从解题转变为优化. 注意点: 1.下一轮是按照上一轮的每个数做运算,但下一轮每次运算都会改变数列的值,造成运算不 ...
- 12行代码AC——例题6-6 小球下落(Droppint Balls, UVa 679)——解题报告
励志用尽量少的代码做高效的表达. 提交(题目)链接→UVa-679 题目大意: 有一颗满二叉树,每个节点是一个开关,初始全是关闭的,小球从顶点落下,如果开关打开,则落向该节点的右子树,如果开关关闭,则 ...
- 19行代码AC——例题 6-2 铁轨(Rails, UVa 514)——解题报告
励志用尽量少的代码做高效的表达. 提交(题目)链接→UVa-514 此题的本质是:给出"入栈顺序",判断给定序列是否可以出栈. 有点像这种题: 因此思路也类似: 思路: 数组存储列 ...
- 22行代码AC——例题7-1除法(Division UVa 725)——解题报告
励志用尽量少的代码做高效的表达 题目(提交)链接→UVa-725 题目大意: 0-9不重复的组成两个5位数,如果数A/数B=n,则为可行解. 思路分析: 本题实质是通过巧妙分析的暴力求解法. 下等解法 ...
- 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 ...
- 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:反转序列(逆置) ...
- 比紫书优化,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个丑数是什么. 没有输入 输 ...
最新文章
- C++项目中的extern C {}
- Android BaseAdapter 例子
- [学习笔记]电磁场与电磁波
- HDU 1506 Largest Rectangle in a Histogram(dp、单调栈)
- easyui扩展-日期范围选择.
- Object 对象详解
- vue delete删除json数组_Vue.set 和 Vue.delete
- SQLServer2008数据库还原失败 恢复失败
- python怎样装pandas_小白学python:坑一:如何安装pandas和numpy
- Java List集合实现倒倒序排列
- 车辆出厂信息接口_最新10项中标招标信息汇总2020.12.7
- 和程序员男友过节是这样的
- php货币2019年12月31日汇率,[外汇]2019年12月31日人民币汇率中间价新公告 今日美元兑人民币行情查询 - 南方财富网...
- 朋友圈投票活动-刷票案例实现与分析
- python入门——热量转换 I
- Python异常及处理
- 2020-11-05T09:00:00+08:00 类型的时间格式化处理(时间转换)
- PhotoShop如何去除图片上的污点、水印
- 论文理解 A Survey on Trajectory-Prediction Methods for Autonomous Driving
- Oracle 数据库自动诊断库 ADR(Automatic Diagnostic Repository)简介 发表在 数据和云