• hdu 4920 Matrix multiplication (矩阵计算)


    题目链接

    题意:给两个矩阵a, b, 计算矩阵a*b的结果对3取余。

    分析:直接计算时间复杂度是O(n^3),会超时,但是下面第一个代码勉强可以水过,数据的原因。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <vector>
     4 #include <cstring>
     5 #include <cstdlib>
     6 #include <algorithm>
     7 const int maxn = 800+10;
     8 using namespace std;
     9 int n, a[maxn][maxn], b[maxn][maxn], c[maxn][maxn];
    10 
    11 int main()
    12 {
    13     int i, j, k;
    14     while(~scanf("%d", &n))
    15     {
    16         memset(a, 0, sizeof(a));
    17         memset(b, 0, sizeof(b));
    18         memset(c, 0, sizeof(c));
    19         for(i = 0; i < n; i++)
    20         for(j = 0; j < n; j++)
    21         {
    22             scanf("%d", &a[i][j]);
    23             a[i][j] %= 3;
    24         }
    25         for(i = 0; i < n; i++)
    26         for(j = 0; j < n; j++)
    27         {
    28             scanf("%d", &b[i][j]);
    29             b[i][j] %= 3;
    30         }
    31 
    32         for(i = 0; i < n; i++)
    33         {
    34             for(k = 0; k < n; k++)
    35             if(a[i][k]!=0)
    36             for(j = 0; j < n; j++)
    37             {
    38                c[i][j] += a[i][k]*b[k][j];
    39                //c[i][j] %= 3;  加这个会超时
    40             }
    41         }
    42         for(i = 0; i < n; i++)
    43         {
    44             for(j = 0; j < n; j++)
    45             if(j == 0)
    46             printf("%d", c[i][j]%3);
    47             else
    48             printf(" %d", c[i][j]%3);
    49             printf("
    ");
    50         }
    51     }
    52     return 0;
    53 }

    再贴一个崔老师的代码:

    他把所有的0都忽略了,很巧妙的优化,aa[][], bb[][]里存储的是下一个不为0的位置:

     1 #include <iostream>
     2 #include<stdio.h>
     3 #include<vector>
     4 #include<queue>
     5 #include<stack>
     6 #include<string.h>
     7 #include<algorithm>
     8 #include<map>
     9 using namespace std;
    10 #define LL long long
    11 #define gcd(a,b) (b==0?a:gcd(b,a%b))
    12 #define lcm(a,b) (a*b/gcd(a,b))
    13 //O(n)求素数,1-n的欧拉数
    14 #define N 100010
    15 //A^x = A^(x % Phi(C) + Phi(C)) (mod C)
    16 int a[880][880];
    17 int b[880][880];
    18 int aa[880][880];
    19 int bb[880][880];
    20 int c[880][880];
    21 int main()
    22 {
    23     int n;
    24     while(~scanf("%d",&n))
    25     {
    26         memset(a,0,sizeof(a));
    27         memset(b,0,sizeof(b));
    28         memset(aa,0,sizeof(aa));
    29         memset(bb,0,sizeof(bb));
    30         memset(c,0,sizeof(c));
    31         for(int i=1;i<=n;i++)
    32         {
    33             for(int j=1;j<=n;j++)
    34             {
    35                 scanf("%d",&a[i][j]);
    36                 a[i][j]%=3;
    37             }
    38         }
    39         for(int i=1;i<=n;i++)
    40         {
    41             for(int j=1;j<=n;j++)
    42             {
    43                 scanf("%d",&b[i][j]);
    44                 b[i][j]%=3;
    45             }
    46         }
    47         for(int i=1;i<=n;i++)
    48         {
    49             int x=-1;
    50             for(int j=n;j>=0;j--)
    51             {
    52                 aa[i][j]=x;
    53                 if(a[i][j])x=j;
    54             }
    55         }
    56         for(int i=1;i<=n;i++)
    57         {
    58             int x=-1;
    59             for(int j=n;j>=0;j--)
    60             {
    61                 bb[i][j]=x;
    62                 if(b[i][j])x=j;
    63             }
    64         }
    65         for(int i=1;i<=n;i++)
    66         {
    67             for(int j=aa[i][0];j!=-1;j=aa[i][j])
    68             {
    69                 for(int k=bb[j][0];k!=-1;k=bb[j][k])
    70                     c[i][k]+=a[i][j]*b[j][k];
    71             }
    72         }
    73         for(int i=1;i<=n;i++)
    74         {
    75             for(int j=1;j<=n;j++)
    76             {
    77                 printf("%d",c[i][j]%3);
    78                 if(j!=n)printf(" ");
    79                 else printf("
    ");
    80             }
    81         }
    82     }
    83     return 0;
    84 }
  • 相关阅读:
    gdb查看内存(转)
    c++ 前置++与后置++的区别
    stl第二级空间配置器详解(1)
    stl空间配置器简介
    套接字描述符就绪条件
    针对TCP连接异常断开的分析
    linux僵尸进程产生的原因以及如何避免产生僵尸进程
    k8s istio 配置域名转发到外部节点机器上
    tinymce增加mathjax 支持数学公式录入渲染
    vue 配置 TinyMCE
  • 原文地址:https://www.cnblogs.com/bfshm/p/3893063.html
Copyright © 2020-2023  润新知