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
 
 
 
题目就是裸的矩阵乘法。
 
代码:
 #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 矩阵乘法的更多相关文章

  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. 【ASP.NET系列】详解Views

    描述 本片文章内容属于ASP.NET MVC系列视图篇,主要讲解View,大致内容如下: 1.Views文件夹讲解 2.View种类 3.Razor语法 4.对视图的基本操作 一   Views文件夹 ...

  2. ArcGIS 网络分析[1.1] 创建用于网络分析用的线类型shp文件[这个太基础了吧!]

    具体的准备,在上一篇就说过了,不再赘述. 阅读本篇前,需要的预备知识是:ArcGIS创建各种矢量数据的方法,了解地理坐标与投影坐标 本篇只创建单一的线数据,至于点数据,以后进行复杂的网络分析时再添加进 ...

  3. 简单记录一下原生ajax

    面试老忘记,代码如下 function ajax() { var xmlHttpRequest = null; //定义XMLHttp对象的容器 if(window.XMLHttpRequest) { ...

  4. golang sql database drivers

    https://github.com/golang/go/wiki/SQLDrivers SQL database drivers The database/sql and database/sql/ ...

  5. MobaXterm

    MobaXterm又名MobaXVT,是一款增强型终端.X服务器和Unix命令集(GNU/ Cygwin)封装在一个单一的便携式exe文件.MobaXterm可以开启多个终端视窗,以最新的X服务器为基 ...

  6. webpack配置报错:invalid configuration object.webpack has been initialisted using a configuration objcet that does not match thie API schema

    最近接收了别人的项目,webpack配置总是报错如下:最后找到了解决办法,在此分享一下: 错误情况: 解决办法: 将package.json里面的colors删除掉即可

  7. Chrome不支持本地Ajax请求,解决办法

    Chrome不支持本地Ajax请求,当我在.html文件中访问.json文件时就会出现这个问题,就是说这个时候不能加载这个.html文件. 解决方式 打开Chrome快捷方式的属性中设置: 右击Chr ...

  8. 在linux环境下编译运行OpenCV程序的两种方法

    原来以为在Ubuntu下安装好了OpenCV之后,自己写个简单的程序应该很容易吧,但是呢,就是为了编译一个简单的显示图片的程序我都快被弄崩溃了. 在谷歌和上StackOverFlow查看相关问题解答之 ...

  9. android inline hook

    最近终于沉下心来对着书把hook跟注入方面的代码敲了一遍,打算写几个博客把它们记录下来. 第一次介绍一下我感觉难度最大的inline hook,实现代码参考了腾讯GAD的游戏安全入门. inline ...

  10. Java求循环节长度

    两个整数做除法,有时会产生循环小数,其循环部分称为:循环节.比如,11/13=6=>0.846153846153.....  其循环节为[846153] 共有6位.下面的方法,可以求出循环节的长 ...