HDU4920-Matrix multiplication-矩阵乘法 51nod-1137 矩阵乘法
Matrix multiplication
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 5236 Accepted Submission(s): 2009
bobo hates big integers. So you are only asked to find the result modulo 3.
The first line contains n (1≤n≤800). Each of the following n lines contain n integers -- the description of the matrix A. The j-th integer in the i-th line equals Aij. The next n lines describe the matrix B in similar format (0≤Aij,Bij≤109).
Print n lines. Each of them contain n integers -- the matrix A×B in similar format.
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- #include<cstdlib>
- #include<string.h>
- #include<set>
- #include<vector>
- #include<queue>
- #include<stack>
- #include<map>
- #include<cmath>
- using namespace std;
- int a[][],b[][],c[][];
- int main(){
- int n;
- while(~scanf("%d",&n)){
- for(int i=;i<n;i++)
- for(int j=;j<n;j++){
- scanf("%d",&a[i][j]);
- a[i][j]%=;
- c[i][j]=;
- }
- for(int i=;i<n;i++)
- for(int j=;j<n;j++){
- scanf("%d",&b[i][j]);
- b[i][j]%=;
- }
- for(int i=;i<n;i++)
- for(int j=;j<n;j++){
- if(!a[i][j])continue;//判断优化
- for(int k=;k<n;k++)
- c[i][k]=c[i][k]+a[i][j]*b[j][k];
- }
- for(int i=;i<n;i++){
- for(int j=;j<n;j++)
- if(j==n-)printf("%d\n",c[i][j]%);
- else printf("%d ",c[i][j]%);
- }
- }
- return ;
- }
看其他题解
这个题有两种解法,一种是先对矩阵进行%3,
然后在3次方循环里判断如果元素如果是0,则continue不进行乘积的累加的结果。能起到优化的作用。
还有一种就是对矩阵进行某一个进行转置后,再进行两个矩阵的乘积累加。也能起到优化。
代码:
- #include<iostream>
- #include<cstring>
- #include<cmath>
- #include<cstdio>
- #include<algorithm>
- using namespace std;
- int a[][],b[][],c[][];
- int main(){
- int n;
- while(~scanf("%d",&n)){
- for(int i=;i<n;i++)
- for(int j=;j<n;j++){
- scanf("%d",&a[i][j]);
- a[i][j]%=;
- c[i][j]=;
- }
- for(int i=;i<n;i++)
- for(int j=;j<n;j++){
- scanf("%d",&b[i][j]);
- b[i][j]%=;
- }
- for(int i=;i<n;i++)
- for(int j=;j<n;j++)
- swap(b[i][j],b[j][i]);//转置优化
- for(int i=;i<n;i++)
- for(int j=;j<n;j++){
- //if(!a[i][j])continue;
- for(int k=;k<n;k++)
- c[i][k]=c[i][k]+a[i][j]*b[j][k];
- }
- for(int i=;i<n;i++){
- for(int j=;j<n;j++)
- if(j==n-)printf("%d\n",c[i][j]%);
- else printf("%d ",c[i][j]%);
- }
- }
- return ;
- }
用转置的话,也可以继续用3次方循环里判断元素是否为0,continue来优化。
直接判断的优化,时间跑1279MS,用转置不用判断是1653MS,用转置也用判断是1482MS,emnnnn。。。
- for(int i=;i<n;i++)
- for(int j=;j<n;j++){
- for(int k=;k<n;k++)
- c[i][k]=c[i][k]+a[i][j]*b[j][k];
- }
如果是按这种循环写,不管有没有在3次方循环里判断元素是否为0,或者不管有没有转置,都不会超时!!!
然后就是还发现了一个问题,如果三层循环里面写的是c[i][j]的循环会超时的。
- for(int i=;i<n;i++)
- for(int j=;j<n;j++){
- for(int k=;k<n;k++)
- c[i][j]=c[i][j]+a[i][k]*b[k][j];
- }
这个题简直有毒啊。
不管是直接判断优化还是转置优化,还是转置+判断优化,都是超时。
在经过这么多次智障操作之后(之后又交了一发,一共23次),并且在记录了循环的次数之后!!!
我发现。。。
- int num=;
- for(int i=;i<n;i++)
- for(int j=;j<n;j++){
- //if(!a[i][j])continue;
- for(int k=;k<n;k++){
- c[i][k]=c[i][k]+a[i][j]*b[j][k];
- num++;
- }
- }
在都不经过优化的情况下,num的次数都是一样的,两个循环的次数都是一样的。
为什么一个可以过,一个就超时呢???(所有的都测过了_(:з」∠)_ )
未解之谜啊啊啊啊啊啊啊啊啊啊啊啊啊啊_(:з」∠)_
玩不了玩不了。。。
由于C与C++的二维数组是以行为主序存储的。
因此矩阵a的行数据元素是连续存储的,而矩阵b的列数据元素是不连续存储的(N*1的矩阵除外),
为了在矩阵相乘时对矩阵b也连续读取数据,根据局部性原理对矩阵b进行转置。
然而并没有什么用,在不转置的情况下,c[i][k]的是两个按行的,c[i][j]是一个按行的。c[i][k]比c[i][j]快我可以理解。但是!!!
转置之后,c[i][k]是两个按列的,c[i][j]是一个按行的,按道理应该是c[i][j]的快啊,但是为什么还是c[i][k]]快啊。
啊啊啊啊啊啊啊,玩不了玩不了。
HDU4920-Matrix multiplication-矩阵乘法 51nod-1137 矩阵乘法的更多相关文章
- hdu4920 Matrix multiplication 模3矩阵乘法
hdu4920 Matrix multiplication Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 ...
- 51nod 1137.矩阵乘法-矩阵乘法
1137 矩阵乘法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出2个N * N的矩阵M1和M2,输出2个矩阵相乘后的结果. Input 第1行:1个数N, ...
- 51nod 1137 矩阵乘法【矩阵】
1137 矩阵乘法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出2个N * N的矩阵M1和M2,输出2个矩阵相乘后的结果. Input 第1行 ...
- HDU-4920 Matrix multiplication
矩阵相乘,采用一行的去访问,比采用一列访问时间更短,根据数组是一行去储存的.神奇小代码. Matrix multiplication Time Limit: 4000/2000 MS (Java/Ot ...
- 51nod 1137 矩阵乘法
基本的矩阵乘法 中间for(int j=0;i<n;i++) //这里写错了 应该是j<n 晚上果然 效率不行 等会早点儿睡 //矩阵乘法 就是 两个矩阵 第一个矩阵的列 等与 第 ...
- HDU4920 Matrix multiplication 矩阵
不要问窝 为什么过了> < 窝也不造为什么就过了 说是%3变成稀疏矩阵 可是随便YY个案例都会超时.. . 看来数据是随机的诶 #include <stdio.h> #incl ...
- 【bitset】hdu4920 Matrix multiplication
先把两个矩阵全都mod3. S[i][j][k]表示第i(0/1)个矩阵的行/列的第k位是不是j(1/2). 然后如果某两个矩乘对应位上为1.1,乘出来是1: 1.2:2: 2.1:2: 2.2:1. ...
- 矩阵乘法 --- hdu 4920 : Matrix multiplication
Matrix multiplication Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/ ...
- hdu 4920 Matrix multiplication(矩阵乘法)2014多培训学校5现场
Matrix multiplication Time ...
- 数学(矩阵乘法,随机化算法):POJ 3318 Matrix Multiplication
Matrix Multiplication Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17783 Accepted: ...
随机推荐
- iOS 进阶—— iOS 内存管理
1 似乎每个人在学习 iOS 过程中都考虑过的问题 alloc retain release delloc 做了什么? autoreleasepool 是怎样实现的? __unsafe_unretai ...
- epoll的使用实例
在网络编程中通常需要处理很多个连接,可以用select和poll来处理多个连接.但是select都受进程能打开的最大文件描述符个数的限制.并且select和poll效率会随着监听fd的数目增多而下降. ...
- [WinForm]委托应用①——窗口之间方法/控件调用
不传参数 第二窗口:public partial class Form2 : Form { /// <summary> /// 定义委托 /// </summary> publ ...
- 一个两年java程序猿的2017个人总结
前言 又到了一年中最后的日子了,相信有不少公司要求员工写年度总结了,我也不例外.不过个人感觉在公司的写个年度总结来说,过于模板化了.其实很多没有必要.总之,本篇的个人总结,是按照个人的想法写的.简而言 ...
- React Native绑定微信分享/登录/支付(演示+实现步骤+注意事项)
React Native(以下简称RN)绑定微信分享/微信登录/微信支付的实现演示+源码+注意事项!微信的调用大同小异,本文实现了微信的分享功能,其他功能可以在链接文档里面找到具体的方法. 本文分文三 ...
- mysql-5.7.17.msi安装
mysql-5.7.17.msi安装,跟着截图摩擦,一步一步是爪牙,是魔鬼的步伐 开始: 可以创建其他用户 我自己改了日志名
- bzoj 3575: [Hnoi2014]道路堵塞
Description A 国有N座城市,依次标为1到N.同时,在这N座城市间有M条单向道路,每条道路的长度是一个正整数.现在,A国交通部指定了一条从城市1到城市N的路径, 并且保证这条路径的长度是所 ...
- 5.Nginx作为web缓存服务器
Nginx作为web缓存服务器 从0.7.48版本开始,Nginx支持类似Squid的缓存功能.Nginx的web缓存服务主要由proxy_cache相关命令集合fastcgi_cache相关命令集构 ...
- springmvc注入类 NoUniqueBeanDefinitionException: No qualifying bean of type [] is defined: expected single错误
在springmvc中注入服务时用@Service 当有两个实现类时都标明@Service后则会出现异常: nested exception is org.springframework.beans. ...
- [Redis源码阅读]dict字典的实现
dict的用途 dict是一种用于保存键值对的抽象数据结构,在redis中使用非常广泛,比如数据库.哈希结构的底层. 当执行下面这个命令: > set msg "hello" ...