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]]快啊。

啊啊啊啊啊啊啊,玩不了玩不了。

传送门:虽然名字叫矩阵乘法优化,然而并没有什么用

HDU 4920.Matrix multiplication-矩阵乘法的更多相关文章

  1. HDU 4920 Matrix multiplication(矩阵相乘)

    各种TEL,233啊.没想到是处理掉0的情况就能够过啊.一直以为会有极端数据.没想到居然是这种啊..在网上看到了一个AC的奇妙的代码,经典的矩阵乘法,仅仅只是把最内层的枚举,移到外面就过了啊...有点 ...

  2. HDU 4920 Matrix multiplication 矩阵相乘。稀疏矩阵

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

  3. HDU 4920 Matrix multiplication(bitset)

    HDU 4920 Matrix multiplication 题目链接 题意:给定两个矩阵,求这两个矩阵相乘mod 3 思路:没什么好的想法,就把0的位置不考虑.结果就过了.然后看了官方题解,上面是用 ...

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

    Matrix multiplication                                                                           Time ...

  5. hdu 4920 Matrix multiplication bitset优化常数

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

  6. HDU 4920 Matrix multiplication(bitset优化)

    题目链接 Matrix multiplication 求矩阵A和B相乘的结果. 因为答案只要对3取模,所以我们可以通过一些方法来加速计算. 我们对两个矩阵各开两个bitset,分别存储模3余1和模3余 ...

  7. 2014多校第五场1010 || HDU 4920 Matrix multiplication(矩阵乘法优化)

    题目链接 题意 : 给你两个n*n的矩阵,然后两个相乘得出结果是多少. 思路 :一开始因为知道会超时所以没敢用最普通的方法做,所以一直在想要怎么处理,没想到鹏哥告诉我们后台数据是随机跑的,所以极端数据 ...

  8. HDU 4920 Matrix multiplication (硬件优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4920 解题报告:求两个800*800的矩阵的乘法. 参考这篇论文:http://wenku.baidu ...

  9. hdu - 4920 - Matrix multiplication(缓存优化+开挂)

    题意:求两个n x n的矩阵相乘后模3的结果,n <= 800. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4920 -->>呀呀 ...

随机推荐

  1. leetcode 【 Remove Duplicates from Sorted List 】 python 实现

    题目: Given a sorted linked list, delete all duplicates such that each element appear only once. For e ...

  2. 解决idea无法下载插件的问题

    分析原因: 使用了 https 协议下载而导致的问题. 解决办法: 找到 File -> Settings -> Appearance & Behavior -> Syste ...

  3. SSTI注入绕过(沙盒逃逸原理一样)

    在python沙盒逃逸中绕过道理是一样的. 1.python沙盒中删除了很多模块,但是没有删除reload reload(__builtins__),重新加载被删除的模块,直接命令执行,只用于py2 ...

  4. .swp文件的恢复

    .swp 编辑文件的过程中会出现这个隐藏文件. 文件如果正常保存,.swp就会自动删除.如果不正常退出,比如关机,.swp就会留下来. linux下: ls -all 可以查看隐藏文件 命令: vi ...

  5. leetcode_day02

    任务二:删除排序数组中的重复项 原文链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/ 最开始的解决思路: ...

  6. vmware设置静态ip(复制)

    一.安装好虚拟后在菜单栏选择编辑→ 虚拟网络编辑器,打开虚拟网络编辑器对话框,选择Vmnet8 Net网络连接方式,随意设置子网IP,点击NAT设置页面,查看子网掩码和网关,后面修改静态IP会用到. ...

  7. Client does not support authentication protocol requested by server

    关于由于版本号码不同而引起的 Client does not support authentication protocol requested by server 问题 搜索类似的问题,得到的答案类 ...

  8. poj 3080 kmp求解多个字符串的最长公共字串,(数据小,有点小暴力 16ms)

    Blue Jeans Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14113   Accepted: 6260 Descr ...

  9. min_free_kbytes是内存最安全值的阈值,然后这个值是怎么影响到系统内存回收的呢?

    min_free_kbytes 内存域水印值:min_free_kbytes 当不设置的时候:sqrt(16M)=4k 4k*4 = 16k 设置内存水印值的函数是: 6792 /* 6793 * I ...

  10. 省选算法学习-回文自动机 && 回文树

    前置知识 首先你得会manacher,并理解manacher为什么是对的(不用理解为什么它是$O(n)$,这个大概记住就好了,不过理解了更方便做$PAM$的题) 什么是回文自动机? 回文自动机(Pal ...