HDU 4920 Matrix multiplication (硬件优化)

时间:2023-01-27 16:25:35

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4920

解题报告:求两个800*800的矩阵的乘法。

参考这篇论文:http://wenku.baidu.com/link?url=261XeEzH-AZkFGPiN63t1nnojoQF50yiuMoviHroGjVXjjRlxFcvWLcws0jgQcmZo4oA9BJcjnPxVreWRu-XXa9zb6r5gUUTxmBXn_qWSsu&qq-pf-to=pcqq.group

我看过了,只是简单的了解了一下,本来暴力是会超时的,但是因为C和C++的二维数组都是优先存储行,也就是说在一行元素是存储在相邻位置的,

所以如果把第二个相乘的矩阵转置一下,就可以直接是A[i][k] * B[j][k]了,这样就不会超了,具体的原因自己去看吧。在这篇论文里面有详细介绍。

其次,最好用C提交,因为C还是要比C++快一点的。

 #include<stdio.h>
int A[][],B[][],tot,i,j,k;
void Swap(int* a,int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(i = ;i < n;++i)
for(j = ;j < n;++j)
{
scanf("%d",&A[i][j]);
A[i][j] %= ;
}
for(i = ;i < n;++i)
for(j = ;j < n;++j)
{
scanf("%d",&B[i][j]);
B[i][j] %= ;
}
for(i = ;i < n;++i)
for(j = ;j < i;++j)
Swap(&B[i][j],&B[j][i]);
for(i = ;i < n;++i)
for(j = ;j < n;++j)
{
tot = ;
for(k = ;k < n;++k)
tot += (A[i][k] * B[j][k]);
printf(j == n-? "%d\n":"%d ",tot % );
}
}
return ;
}