2014 Multi-University Training Contest 5 HDOJ 4920 Matrix multiplication

題目:

Matrix multiplication

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 384    Accepted Submission(s): 138


Problem Description
Given two matrices A and B of size n×n, find the product of them.

bobo hates big integers. So you are only asked to find the result modulo 3.
 

Input
The input consists of several tests. For each tests:

The first line contains n (1≤n≤800). Each of the following n lines contain n integers -- the description of the matrix A. The j-th integer in the i-th line equals Aij. The next n lines describe the matrix B in similar format (0≤Aij,Bij≤109).
 

Output
For each tests:

Print n lines. Each of them contain n integers -- the matrix A×B in similar format.
 

Sample Input
1 0 1 2 0 1 2 3 4 5 6 7
 

Sample Output
0 0 1 2 1

傳送門:點擊打開鏈接

解題思路:

矩陣乘法優化,這題數據量800,用一般的矩陣乘法會超時,我們可以對齊進行優化。C=A*B,在讀入的時候將B逆置,相乘的時候,c[i][j] = A的第i行×B的第j行。之前我是直接用經典的矩陣乘法做的,TLE,用斯特拉森矩陣算法也是TLE,哭瞎,這種思路還是聽了tsm學弟說的,orz學弟。ps:這種做法要用C編譯器提交。

相關論文:點擊打開鏈接


代碼:

#include <stdio.h>

int a[805][805], b[805][805], c[805][805];

int main()
{
    int n, i, j, k, x;
    while(~scanf("%d", &n))
    {
        for(i=0; i<n; i++)
            for(j=0; j<n; j++)
            {
                scanf("%d", &x);
               a[i][j] = x % 3;
            }

        for(i=0; i<n; i++)
            for(j=0; j<n; j++)
            {
               scanf("%d", &x);
                b[j][i] = x % 3;
            }

        for(i=0; i<n; i++)
        {
            for(j=0; j<n; j++)
            {
                c[i][j] = 0;
                for(k=0; k<n; k++)
                    c[i][j] = c[i][j] + a[i][k]*b[j][k];
                printf( j==0 ? "%d" : " %d",c[i][j]%3);
            }
            printf("\n");
        }
    }
    return 0;
}



發佈了187 篇原創文章 · 獲贊 14 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章