HDU 4920 Matrix multiplication (硬件优化)

题目链接: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++快一点的。

 1 #include<stdio.h>
 2 int A[805][805],B[805][805],tot,i,j,k;
 3 void Swap(int* a,int* b)
 4 {
 5     int temp = *a;
 6     *a = *b;
 7     *b = temp;
 8 }
 9 int main()
10 {
11     int n;
12     while(scanf("%d",&n)!=EOF)
13     {
14         for(i = 0;i < n;++i)
15         for(j = 0;j < n;++j)
16         {
17             scanf("%d",&A[i][j]);
18             A[i][j] %= 3;
19         }
20         for(i = 0;i < n;++i)
21         for(j = 0;j < n;++j)
22         {
23             scanf("%d",&B[i][j]);
24             B[i][j] %= 3;
25         }
26         for(i = 0;i < n;++i)
27         for(j = 0;j < i;++j)
28         Swap(&B[i][j],&B[j][i]);
29         for(i = 0;i < n;++i)
30         for(j = 0;j < n;++j)
31         {
32             tot = 0;
33             for(k = 0;k < n;++k)
34             tot += (A[i][k] * B[j][k]);
35             printf(j == n-1? "%d
":"%d ",tot % 3);
36         }
37     }
38     return 0;
39 }
View Code
原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3894814.html