Matrix multiplication

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 5236    Accepted Submission(s): 2009

Problem Description
Given two matrices A and B of size n×n, find the product of them.

bobo hates big integers. So you are only asked to find the result modulo 3.

 
Input
The input consists of several tests. For each tests:

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).

 
Output
For each tests:

Print n lines. Each of them contain n integers -- the matrix A×B in similar format.

 
Sample Input
1
0
1
2
0 1
2 3
4 5
6 7
 
Sample Output
0
0 1
2 1
 
Author
Xiaoxu Guo (ftiasch)
 
Source
 
 
 
题目就是裸的矩阵乘法。
 
代码:
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cstdlib>
  6. #include<string.h>
  7. #include<set>
  8. #include<vector>
  9. #include<queue>
  10. #include<stack>
  11. #include<map>
  12. #include<cmath>
  13. using namespace std;
  14.  
  15. int a[][],b[][],c[][];
  16.  
  17. int main(){
  18. int n;
  19. while(~scanf("%d",&n)){
  20. for(int i=;i<n;i++)
  21. for(int j=;j<n;j++){
  22. scanf("%d",&a[i][j]);
  23. a[i][j]%=;
  24. c[i][j]=;
  25. }
  26. for(int i=;i<n;i++)
  27. for(int j=;j<n;j++){
  28. scanf("%d",&b[i][j]);
  29. b[i][j]%=;
  30. }
  31. for(int i=;i<n;i++)
  32. for(int j=;j<n;j++){
  33. if(!a[i][j])continue;//判断优化
  34. for(int k=;k<n;k++)
  35. c[i][k]=c[i][k]+a[i][j]*b[j][k];
  36. }
  37. for(int i=;i<n;i++){
  38. for(int j=;j<n;j++)
  39. if(j==n-)printf("%d\n",c[i][j]%);
  40. else printf("%d ",c[i][j]%);
  41. }
  42. }
  43. return ;
  44. }

看其他题解

这个题有两种解法,一种是先对矩阵进行%3,

然后在3次方循环里判断如果元素如果是0,则continue不进行乘积的累加的结果。能起到优化的作用。

还有一种就是对矩阵进行某一个进行转置后,再进行两个矩阵的乘积累加。也能起到优化。

代码:

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cmath>
  4. #include<cstdio>
  5. #include<algorithm>
  6. using namespace std;
  7. int a[][],b[][],c[][];
  8.  
  9. int main(){
  10. int n;
  11. while(~scanf("%d",&n)){
  12. for(int i=;i<n;i++)
  13. for(int j=;j<n;j++){
  14. scanf("%d",&a[i][j]);
  15. a[i][j]%=;
  16. c[i][j]=;
  17. }
  18. for(int i=;i<n;i++)
  19. for(int j=;j<n;j++){
  20. scanf("%d",&b[i][j]);
  21. b[i][j]%=;
  22. }
  23. for(int i=;i<n;i++)
  24. for(int j=;j<n;j++)
  25. swap(b[i][j],b[j][i]);//转置优化
  26. for(int i=;i<n;i++)
  27. for(int j=;j<n;j++){
  28. //if(!a[i][j])continue;
  29. for(int k=;k<n;k++)
  30. c[i][k]=c[i][k]+a[i][j]*b[j][k];
  31. }
  32. for(int i=;i<n;i++){
  33. for(int j=;j<n;j++)
  34. if(j==n-)printf("%d\n",c[i][j]%);
  35. else printf("%d ",c[i][j]%);
  36. }
  37. }
  38. return ;
  39. }

用转置的话,也可以继续用3次方循环里判断元素是否为0,continue来优化。

直接判断的优化,时间跑1279MS,用转置不用判断是1653MS,用转置也用判断是1482MS,emnnnn。。。

  1. for(int i=;i<n;i++)
  2. for(int j=;j<n;j++){
  3. for(int k=;k<n;k++)
  4. c[i][k]=c[i][k]+a[i][j]*b[j][k];
  5. }

如果是按这种循环写,不管有没有在3次方循环里判断元素是否为0,或者不管有没有转置,都不会超时!!!

然后就是还发现了一个问题,如果三层循环里面写的是c[i][j]的循环会超时的。

  1. for(int i=;i<n;i++)
  2. for(int j=;j<n;j++){
  3. for(int k=;k<n;k++)
  4. c[i][j]=c[i][j]+a[i][k]*b[k][j];
  5. }

这个题简直有毒啊。

不管是直接判断优化还是转置优化,还是转置+判断优化,都是超时。

在经过这么多次智障操作之后(之后又交了一发,一共23次),并且在记录了循环的次数之后!!!

我发现。。。

  1. int num=;
  2. for(int i=;i<n;i++)
  3. for(int j=;j<n;j++){
  4. //if(!a[i][j])continue;
  5. for(int k=;k<n;k++){
  6. c[i][k]=c[i][k]+a[i][j]*b[j][k];
  7. num++;
  8. }
  9. }

在都不经过优化的情况下,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 矩阵乘法的更多相关文章

  1. hdu4920 Matrix multiplication 模3矩阵乘法

    hdu4920 Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 ...

  2. 51nod 1137.矩阵乘法-矩阵乘法

    1137 矩阵乘法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题   给出2个N * N的矩阵M1和M2,输出2个矩阵相乘后的结果.   Input 第1行:1个数N, ...

  3. 51nod 1137 矩阵乘法【矩阵】

    1137 矩阵乘法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出2个N * N的矩阵M1和M2,输出2个矩阵相乘后的结果.   Input 第1行 ...

  4. HDU-4920 Matrix multiplication

    矩阵相乘,采用一行的去访问,比采用一列访问时间更短,根据数组是一行去储存的.神奇小代码. Matrix multiplication Time Limit: 4000/2000 MS (Java/Ot ...

  5. 51nod 1137 矩阵乘法

    基本的矩阵乘法 中间for(int j=0;i<n;i++)  //这里写错了   应该是j<n 晚上果然  效率不行 等会早点儿睡 //矩阵乘法 就是 两个矩阵 第一个矩阵的列 等与 第 ...

  6. HDU4920 Matrix multiplication 矩阵

    不要问窝 为什么过了> < 窝也不造为什么就过了 说是%3变成稀疏矩阵 可是随便YY个案例都会超时.. . 看来数据是随机的诶 #include <stdio.h> #incl ...

  7. 【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. ...

  8. 矩阵乘法 --- hdu 4920 : Matrix multiplication

    Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/ ...

  9. hdu 4920 Matrix multiplication(矩阵乘法)2014多培训学校5现场

    Matrix multiplication                                                                           Time ...

  10. 数学(矩阵乘法,随机化算法):POJ 3318 Matrix Multiplication

    Matrix Multiplication Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17783   Accepted: ...

随机推荐

  1. iOS 进阶—— iOS 内存管理

    1 似乎每个人在学习 iOS 过程中都考虑过的问题 alloc retain release delloc 做了什么? autoreleasepool 是怎样实现的? __unsafe_unretai ...

  2. epoll的使用实例

    在网络编程中通常需要处理很多个连接,可以用select和poll来处理多个连接.但是select都受进程能打开的最大文件描述符个数的限制.并且select和poll效率会随着监听fd的数目增多而下降. ...

  3. [WinForm]委托应用①——窗口之间方法/控件调用

    不传参数 第二窗口:public partial class Form2 : Form { /// <summary> /// 定义委托 /// </summary> publ ...

  4. 一个两年java程序猿的2017个人总结

    前言 又到了一年中最后的日子了,相信有不少公司要求员工写年度总结了,我也不例外.不过个人感觉在公司的写个年度总结来说,过于模板化了.其实很多没有必要.总之,本篇的个人总结,是按照个人的想法写的.简而言 ...

  5. React Native绑定微信分享/登录/支付(演示+实现步骤+注意事项)

    React Native(以下简称RN)绑定微信分享/微信登录/微信支付的实现演示+源码+注意事项!微信的调用大同小异,本文实现了微信的分享功能,其他功能可以在链接文档里面找到具体的方法. 本文分文三 ...

  6. mysql-5.7.17.msi安装

    mysql-5.7.17.msi安装,跟着截图摩擦,一步一步是爪牙,是魔鬼的步伐 开始: 可以创建其他用户 我自己改了日志名

  7. bzoj 3575: [Hnoi2014]道路堵塞

    Description A 国有N座城市,依次标为1到N.同时,在这N座城市间有M条单向道路,每条道路的长度是一个正整数.现在,A国交通部指定了一条从城市1到城市N的路径, 并且保证这条路径的长度是所 ...

  8. 5.Nginx作为web缓存服务器

    Nginx作为web缓存服务器 从0.7.48版本开始,Nginx支持类似Squid的缓存功能.Nginx的web缓存服务主要由proxy_cache相关命令集合fastcgi_cache相关命令集构 ...

  9. springmvc注入类 NoUniqueBeanDefinitionException: No qualifying bean of type [] is defined: expected single错误

    在springmvc中注入服务时用@Service 当有两个实现类时都标明@Service后则会出现异常: nested exception is org.springframework.beans. ...

  10. [Redis源码阅读]dict字典的实现

    dict的用途 dict是一种用于保存键值对的抽象数据结构,在redis中使用非常广泛,比如数据库.哈希结构的底层. 当执行下面这个命令: > set msg "hello" ...