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++快一点的。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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\n":"%d ",tot % 3); 36 } 37 } 38 return 0; 39 }