【城会玩】hdu 4920 Matrix multiplication【矩阵相乘优化】
2016-07-17 14:30
417 查看
Matrix multiplication
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 4220 Accepted Submission(s): 1692
[align=left]Problem Description[/align]
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.
[align=left]Input[/align]
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).
[align=left]Output[/align]
For each tests:
Print n lines. Each of them contain n integers -- the matrix A×B in similar format.
[align=left]Sample Input[/align]
1
0
1
2
0 1
2 3
4 5
6 7
[align=left]Sample Output[/align]
0
0 1
2 1
[align=left]Author[/align]
Xiaoxu Guo (ftiasch)
[align=left]Source[/align]
2014 Multi-University Training Contest 5
[align=left]Recommend[/align]
We have carefully selected several similar problems for you: 5717 5716 5715 5714 5713
题目大意:输入一个n,表示两个矩阵的大小,然后接下来两个n*n的矩阵输入,要求输出一个矩阵,表示求得两个矩阵相乘的矩阵。
思路;
1、我们来看直接根据矩阵乘法规则写的代码:
<span style="white-space:pre"> </span>for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
for(int k=0;k<n;k++)
{
c[i][j]+=a[i][k]*b[k][j];
c[i][j]%=mod;
}
}
}
如果我们想在这里进行一些优化的话,只能变成这样:
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
for(int k=0;k<n;k++)
{
if(a[i][k]==0||b[k][j]==0)continue;
c[i][j]+=a[i][k]*b[k][j];
c[i][j]%=mod;
}
}
}
显然优化与否没差。
那么思考:如果我们能在第一层或者第二层for那里加一个continue,那么显然能够优化一层n的复杂度。其实我们的矩阵乘法还可以写成这样:
for(int i=0;i<n;i++)
{
for(int k=0;k<n;k++)
{
for(int j=0;j<n;j++)
{
c[i][j]=c[i][j]+a[i][k]*b[k][j];
c[i][j]%=3;
}
}
}
其实就是一行一行的往上加,那么这个时候我们在第二层for那里能够加这样一个优化:
for(int i=0;i<n;i++)
{
for(int k=0;k<n;k++)
{
if(a[i][k]==0)continue;
for(int j=0;j<n;j++)
{
c[i][j]=c[i][j]+a[i][k]*b[k][j];
c[i][j]%=3;
}
}
}
如果0存在比较多的话,优化也就比较多。
那么根据这种求矩阵乘法的方法来做这个题,相对就能够优化很多操作了:
#include<stdio.h>
#include<string.h>
using namespace std;
#define mod 3
int a[802][820];
int b[802][820];
int c[802][820];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
a[i][j]%=3;
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&b[i][j]);
b[i][j]%=3;
c[i][j]=0;
}
}
for(int i=0;i<n;i++)
{
for(int k=0;k<n;k++)
{
if(a[i][k]==0)continue;
for(int j=0;j<n;j++)
{
c[i][j]=c[i][j]+a[i][k]*b[k][j];
c[i][j]%=3;
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n-1;j++)
{
printf("%d ",c[i][j]);
}
printf("%d\n",c[i][n-1]);
}
}
}
相关文章推荐
- GitHub命令笔记
- javascripct导图
- SQL和HQL占位符问题
- html css float left与 float right的使用说明
- servlet学习笔记
- Andrew NG 《machine learning》week 7,class1 —Large Margin Classification
- 验证码对抗之路及现有验证机制介绍
- tomcat9 https ssl配置
- [C#]选择排序
- 线程的创建终止和生命周期
- 《C++ Primer Plus》第17章 输入、输出和文件 学习笔记
- 面向对象
- thinkphp学习_第三天_2
- lib和dll文件的区别和联系
- 【GO之初体验】GO中面向对象的特点
- 画8
- canvas绘画扇形图
- JAVA中三种类型的变量
- 第一次
- AbstractMap抽象类源码解析