华为机试HJ70:矩阵乘法计算量估算
作者:Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
题目描述:
矩阵乘法的运算量与矩阵乘法的顺序强相关。
例如:
A是一个50×10的矩阵,B是10×20的矩阵,C是20×5的矩阵
计算A*B*C有两种顺序:((AB)C)或者(A(BC)),前者需要计算15000次乘法,后者只需要3500次。
编写程序计算不同的计算顺序需要进行的乘法次数。
本题含有多组样例输入!
输入描述:
输入多行,先输入要计算乘法的矩阵个数n,每个矩阵的行数,列数,总共2n的数,最后输入要计算的法则
计算的法则为一个字符串,仅由左右括号和大写字母('A'~'Z')组成,保证括号是匹配的且输入合法!
输出描述:
输出需要进行的乘法次数
示例:
输入:
3 50 10 10 20 20 5 (A(BC))
输出:
3500
解题思路:
本题我用二维数组做的,采用了指针方式,用vector也很方便。Estimate函数用来计算两个矩阵的计算量,并返回相乘后的矩阵;calc函数用来将vector中后面的两个矩阵拿出来计算,再将新生成的矩阵塞进去,以此实现矩阵的连续操作;solve函数是主要求解函数,遍历字符串,将出现的矩阵字母以此塞进vector中,每出现一次')',就进行一个calc计算,这样实现了括号的优先级,若最后遍历完字符串,vector尺寸大于1,类似A(BC)=AD这样的,那就继续执行calc。完毕。
其实题目描述的不是特别严谨,假设括号并不是最小囊括两个,比如((ABC)D),按照我所写的算法逻辑,就会先算BC=E,再算ED=F,再算AF,但实际上应该是ABC=G,再算GD。总的来说,根据不同的题目要求,代码应该有所变通和完善,当前的测试样例不涵盖此类情况,如果未来有不通的案例,可以评论私我~
测试代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std;int* Estimate(int *t1,int *t2,int &sum)
{int t1_row=t1[0];int t1_col=t1[1];int t2_row=t2[0];int t2_col=t2[1];sum=t1_row*t1_col*t2_col;int *t3=new int[2];t3[0]=t1_row;t3[1]=t2_col;return t3;
}int calc(vector<int*> &m)
{int *t1;int *t2;int *t3;int sum=0;t2=m.back();m.pop_back();t1=m.back();m.pop_back();t3=Estimate(t1,t2,sum);m.push_back(t3);return sum;
}int solve(int *a[2],string str)
{vector<int*> m;int sum=0;int k=0;for(int i=0;i<str.size();++i){// 若有')',则对前面的两个矩阵进行了一次计算量估算if(str[i]==')'){sum+=calc(m);}else if(str[i]>='A'&&str[i]<='Z'){m.push_back(a[k]);k++;}// 如果是'(',跳过}while(m.size()>1){sum+=calc(m);}return sum;
}int main()
{int number;while(cin>>number){int**mat=new int*[number];for(int i=0;i<number;++i){mat[i]=new int[2];cin>>mat[i][0];cin>>mat[i][1];}string str;cin>>str;cout<<solve(mat,str)<<endl;delete[] mat;}return 0;
}
华为机试HJ70:矩阵乘法计算量估算相关推荐
- HJ70 矩阵乘法计算量估算 ——
一.题目 二.代码 import java.util.*; public class Main {public static void main(String[] args) {Scanner in ...
- 华为机试 - 最大矩阵和
目录 题目描述 输入描述 输出描述 用例 题目分析 算法实现 题目描述 给定一个二维整数矩阵,要在这个矩阵中选出一个子矩阵,使得这个子矩阵内所有的数字和尽量大,我们把这个子矩阵称为和最大子矩阵,子矩阵 ...
- 【华为机试】火星文计算
题目描述: 已知火星人使用的运算符为#.$,其与地球人的等价公式如下: x#y = 2x+3y+4 x$y = 3*x+y+2 其中x.y是无符号整数 地球人公式按C语言规则计算 火星人公式中,$的优 ...
- 牛客在线编程-华为机试-中等
牛客在线编程题目-华为机试-中等 题号 题目 知识点 难度 通过率 HJ16 购物单 动态规划 中等 21.21% HJ17 坐标移动 字符串 中等 24.79% HJ20 密码验证合格程序 数组 字 ...
- 华为机试108题(C 语言解答)
Nowcoder题库链接:华为机试 HJ1 字符串最后一个单词的长度(字符串) 输入:hello nowcoder输出:8说明: 最后一个单词为nowcoder,长度为8 示例代码: HJ1.c #i ...
- 【华为机试 Python实现】华为机试题集合(已更新171篇)
文章目录 新手指引 数据结构基础 华为机试真题系列 牛客网华为机试系列 Python 八股文系列 <华为机试真题详解>专栏定价99.9 包含 <华为机试真题>的所有题目. 包含 ...
- 【HUAWEI】华为机试试题-105
LeeCode试题链接直接上 HJ1 字符串最后一个单词的长度 HJ2 计算某字符出现次数 HJ3 明明的随机数:随机数去重排序输出(小-大) HJ4 字符串分隔:输入一个字符串,请按长度为8拆分每个 ...
- 【强烈推荐收藏】坚持3个月爆肝华为机试108题C++全解(适合新手入门,就业必刷套题)
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 前言 金九银十,金三银四.当前正处于校招.社招的火热期,之前就想为正在筹备就业的同学们准备刷题宝 ...
- 华为机试训练做题总结(三)
54. 挑7 题目描述 : 输出7有关数字的个数,包括7的倍数,还有包含7的数字(如17,27,37-70,71,72,73-)的个数 思路分析: 这个问题有一个很好的解决办法就是将数字转为字符型,然 ...
- 牛客网华为机试(持续更新ing)
坐标移动 string str; string sub=str.substr(0,n);//取得str的子串,从0坐标开始总计n个字符 sub=str.substr(index);//取得子串,从in ...
最新文章
- 就业丨2018年国内就业薪资高的5大编程语言排行
- 木兰编程语言python_国产编程语言木兰换皮Python 中科院重罚当事人
- python rq asyncio_Python 的异步 IO:Asyncio 简介
- Elasticsearch数据备份与恢复(基于HDFS)
- 【哈理工实验二】HTML+CSS3 旋转齿轮特效
- access denied for_abm怎么样?ACCESS集团携8大国际品牌在进博会首秀,展示abmr 硬核实力!...
- 认清一个人,看这四点就够了
- angularjs中的单选框绑定数据注意事项
- [转] 基于C#的波形显示控件的实现
- CoffeeScript学习(3)—— 函数
- hdu 1061 Rightmost Digit解题报告
- java语言实现二维数组构造二叉树_剑指offer打卡5:二叉树的子结构
- 安装skimage库(ModuleNotFoundError: No module named 'skimage')
- impress.js学习总结
- armv6、armv7、armv7s、armv8、armv64及其i386、x86_64区别
- 中班音乐计算机反思,幼儿园音乐活动反思10篇
- iOS AVCaptureDevice介绍
- 量化投资学习——一份高频因子的研报综述
- InputNumber 数字输入框
- 分享个好用的在线翻译器拍照扫一扫方法
热门文章
- oracle 并置,Oracle Coherence中文教程二:安装Oracle Coherence
- 项目过程管理(八)延期和需求变更
- IMS+金蝶K3搭建简易版本供应商协同管理平台(SRM)
- 51单片机简易MP3程序驱动蜂鸣器播放
- Software Testing - UI自动化测试常用设计模式之原型(Java)
- 提升睡眠质量:程序猿工作伴侣(睡眠革命)
- [转]用python来开发webgame服务端(2)
- 为什么有的计算机没有ppt,电脑上没有ppt怎么办
- Ceph Cache tier配置
- Sovit3D三维可视化开发工具动画定义新功能