您的位置:首页 > 其它

杭电OJ(HDOJ)4920题:Matrix multiplication(线性代数,矩阵相乘)

2014-12-02 22:02 447 查看
题意:

给出两个N*N的矩阵A,B。求出这两个矩阵的乘积C。为了防止展生大数,结果矩阵C的每个元素都模除3,其中保证1<=N<=800,0≤Aij,Bij≤109

示例输入:

1

0

1

2

0 1

2 3

4 5

6 7

示例输出:

0

0 1

2 1

解决方案:






题目是线性代数中的内容,只是A,B都是n*n的矩阵,矩阵C的i行j列元素就等于A的i行所有元素和B的j列所有元素的乘积和。提交给AC结果都是运算超时了,后来知道要优化运算次数,优化的地方好几个,最主要的都要是将乘数为0的乘法运算剔除掉,次要就是模除的优化。运算的时间复杂度就是O(n^3)。

#include<stdio.h>
#define m 3
int A[800][800],B[800][800],C[800][800];
int main()
{
    int n,i,j,k,temp;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=0; i<n; i++)
            for(j=0; j<n; j++)
            {
                scanf("%d",&temp);
                A[i][j]=temp%m;
            }

        for(i=0; i<n; i++)
            for(j=0; j<n; j++)
            {
                scanf("%d",&temp);
                B[i][j]=temp%m;
            }
        for(i=0; i<n; i++)
            for(j=0; j<n; j++)
            {
                C[i][j]=0;
            }

        for(i=0; i<n; i++)//控制C的行
        {
            for(k=0; k<n; k++)//控制A的列,如果A[i][k]是0,0乘任务数为0,就不用相乘累加了
            {
                if(A[i][k]==0)
                    continue;
                for(j=0; j<n; j++)//控制C的列
                    C[i][j]+=A[i][k]*B[k][j];
            }
        }
        for(i=0; i<n; i++)
        {
            printf("%d",C[i][0]%m);
            for(j=1; j<n; j++)
            {
                printf(" %d",C[i][j]%m);
            }
            printf("\n");
        }
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: