zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    使用InstelliJ IDEA创建Web应用程序
    别了WindowsXP
    在MyEclipse中搭建Spring MVC开发环境
    iPhone中国移动收不到彩信,联通不用设置都可以,具体设置方法:
    WebLogic 服务器配置
    c# 第五课 string
    c# 第五课 regex
    c# 第四课 Arrays
    c# 第四课 interfaces
    c# 第五课 async await
  • 原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3894814.html
Copyright © 2011-2022 走看看