您的位置:首页 > 其它

【城会玩】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]);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hdu 4920 杭电 4920