hdu - 4920 - Matrix multiplication(缓存优化+开挂)

题意:求两个n x n的矩阵相乘后模3的结果,n <= 800。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4920

——>>呀呀。。

1、3层计算的for进行缓存优化,根据CPU的L1级缓存的实现原理,减少缓存的变更。如果每次都计算完一个单元格的结果再计算下一个单元格的结果,那么被乘矩阵的访问就会频繁地更新缓存,使效率很低。。

2、输入开挂,G++提效500ms+。。

3、对乘法进行剪枝。。

没有第1个操作,后果是严重的。。

n^3的复杂度A过,但,此不是正解。。

#include <cstdio>
#include <cstring>

const int MAXN = 800 + 10;

int n;
int A[MAXN][MAXN], B[MAXN][MAXN], mtRet[MAXN][MAXN];

int ReadInt()
{
    int nRet = 0;
    char cIn;

    while ((cIn = getchar()) >= '0' && cIn <= '9')
    {
        nRet = nRet * 10 + cIn - '0';
    }

    return nRet % 3;
}

void Read()
{
    getchar();
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= n; ++j)
        {
            A[i][j] = ReadInt();
        }
    }
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= n; ++j)
        {
            B[i][j] = ReadInt();
        }
    }
}

void Solve()
{
    memset(mtRet, 0, sizeof(mtRet));
    for (int i = 1; i <= n; ++i)
    {
        for (int k = 1; k <= n; ++k)
        {
            if(!A[i][k]) continue;
            for (int j = 1; j <= n; ++j)
            {
                mtRet[i][j] += A[i][k] * B[k][j];
            }
        }
    }
}

void Print()
{
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j < n; ++j)
        {
            printf("%d ", mtRet[i][j] % 3);
        }
        printf("%d\n", mtRet[i][n] % 3);
    }
}

int main()
{
    while (scanf("%d", &n) == 1)
    {
        Read();
        Solve();
        Print();
    }
    return 0;
}
时间: 2024-10-25 09:31:27

hdu - 4920 - Matrix multiplication(缓存优化+开挂)的相关文章

hdu 4920 Matrix multiplication bitset优化常数

Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) 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 t

2014多校第五场1010 || HDU 4920 Matrix multiplication(矩阵乘法优化)

题目链接 题意 : 给你两个n*n的矩阵,然后两个相乘得出结果是多少. 思路 :一开始因为知道会超时所以没敢用最普通的方法做,所以一直在想要怎么处理,没想到鹏哥告诉我们后台数据是随机跑的,所以极端数据是不可能会有的,而我们一开始一直在想极端数据能接受的方法......后来看了鹏哥的做法,就是把是0的地方都跳过就可以了,用矩阵保存前一个非0数的位置是多少.二师兄给我看了一个代码,人家根本没用别的优化,直接将最里层k的循环提到了最外层,然后就AC了,对此我表示无语. 1 #include <cstd

hdu 4920 Matrix multiplication(矩阵乘法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4920 Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 989    Accepted Submission(s): 396 Problem Description Given two matr

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 in

hdu 4920 Matrix multiplication(矩阵相乘)多校训练第5场

Matrix multiplication                                                                           Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description Given two matrices A and B of size n×n, find the

HDU 4920 Matrix multiplication(矩阵相乘)

各种TEL,233啊.没想到是处理掉0的情况就可以过啊.一直以为会有极端数据.没想到竟然是这样的啊..在网上看到了一个AC的神奇的代码,经典的矩阵乘法,只不过把最内层的枚举,移到外面就过了啊...有点不理解啊,复杂度不是一样的吗.. Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 640 

HDU 4920 Matrix multiplication

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≤

HDU 4920 Matrix multiplication(bitset)

HDU 4920 Matrix multiplication 题目链接 题意:给定两个矩阵,求这两个矩阵相乘mod 3 思路:没什么好的想法,就把0的位置不考虑,结果就过了.然后看了官方题解,上面是用了bitset这个东西,可以用来存大的二进制数,那么对于行列相乘,其实就几种情况,遇到0都是0了,1 1得1,2 1,1 2得2,2 2得1,所以只要存下行列1和2存不存在分别表示的二进制数,然后取且bitcount一下的个数,就可以计算出相应的数值了 代码: 暴力: #include <cstdi

hdu 4920 Matrix multiplication(高效)

题目链接:4920 Matrix multiplication 题目大意:给定两个n阶矩阵,求矩阵相乘后模3. 解题思路:因为矩阵模掉3后只有0,1,2三种情况.所以对于矩阵A,记录每一行中1,2的位置,借助bitset.矩阵B中每一列1,2的位置.然后对于结果中每个位置,只要考虑1?1,1?2,2?1,2?2的个数即可. #include <cstdio> #include <cstring> #include <bitset> #include <algori

hdu 4920 Matrix multiplication(矩阵坑题)

http://acm.hdu.edu.cn/showproblem.php?pid=4920 被这道题虐了一下午,啥也不说了.继续矩阵吧. 超时就超在每步取余上,要放在最后取余,再者注意三个循环的次序. #include <stdio.h> #include <map> #include <set> #include <stack> #include <queue> #include <vector> #include <cma