zoukankan      html  css  js  c++  java
  • POJ 3213 矩阵乘法(优化)

    思路:
    1.暴力出奇迹 n=1000 n^3矩阵乘法竟然能卡过。。。(Tips:不要乱写读入优化,这玩意儿加了超时,不加AC……)

    2.
    注意题目中的“最多只能有一个地方不一样,,”
    我就想到了 能不能用一行的和来优化一下。。一次算一行
    我们可以手动模拟一下。。 发现了一个规律……
    这里写图片描述

    (本人的草稿纸…… 略乱)



    我就模拟了一下答案的第一行。。
    发现:
    先统计一个sumb[i] +=a[i][j](1<=j<=M)
    这个是B数组第i行前M个数的和
    sumc[i]是C数组第i行的和

    a[i][j]*sumb[j]应该等于sumc[i] (不信的话你可以手动模拟啊~)

    这样子是n^2的复杂度

    如果不等于sumc[i]的话 就做一遍一行的矩阵乘法就OK了。。

    整体复杂度 O (n^2)



    简单的矩阵乘法。。(是不是很短)

    //By SiriusRen
    #include <cstdio>
    using namespace std;
    #define s 1005
    #define ff(x,y) for(int i=1;i<=x;i++)for(int j=1;j<=y;j++)
    int N,P,M,a[s][s],b[s][s],c[s][s],ans[s][s];
    int main(){
        scanf("%d%d%d",&N,&P,&M);
        ff(N,P)scanf("%d",&a[i][j]);
        ff(P,M)scanf("%d",&b[i][j]);
        ff(N,M)scanf("%d",&c[i][j]);
        ff(N,M)for(int k=1;k<=P;k++)ans[i][j]+=a[i][k]*b[k][j];
        ff(N,M)if(ans[i][j]!=c[i][j]){printf("No
    %d %d
    %d",i,j,ans[i][j]);return 0;}
        printf("Yes");
    }





    这是加了优化的

    //By SiriusRen
    #include <cstdio>
    using namespace std;
    #define siz 1005
    int N,P,M,a[siz][siz],b[siz][siz],c[siz][siz],jy[siz],sumb[siz],sumc[siz];
    signed main(){
        scanf("%d%d%d",&N,&P,&M);
        for(int i=1;i<=N;i++)
            for(int j=1;j<=P;j++)
                scanf("%d",&a[i][j]);
        for(int i=1;i<=P;i++)
            for(int j=1;j<=M;j++){
                scanf("%d",&b[i][j]);
                if(j<=M)sumb[i]+=b[i][j];
            }
        for(int i=1;i<=N;i++)
            for(int j=1;j<=M;j++)
                scanf("%d",&c[i][j]),sumc[i]+=c[i][j];
        for(int i=1;i<=N;i++){
            int temp=0;
            for(int j=1;j<=P;j++)
                temp+=a[i][j]*sumb[j];
            if(temp!=sumc[i]){
                for(int j=1;j<=M;j++){
                    for(int k=1;k<=P;k++)
                        jy[j]+=a[i][k]*b[k][j];
                    if(jy[j]!=c[i][j])
                        printf("No
    %d %d
    %d",i,j,jy[j]);
                }
                return 0;
            }
        }
        puts("Yes");
    }

    这里写图片描述

  • 相关阅读:
    shell脚本,通过传入的参数来计算最大值和最小值以及平均值。
    mac date命令
    jstorm系列-2:入门
    jstorm系列-1:入门
    git 如何恢复只是提交到本地的文件(或者commit)
    shell 参数
    shell 运算符
    shell 中的<,<<,>,>>
    shell 学习笔记
    java 多线程剖析
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532313.html
Copyright © 2011-2022 走看看