矩阵乘法2 (Codevs No.3147)

2016-06-01 17:33:30

题目链接: 矩阵乘法2 (Codevs No.3147)

题目大意:

  给定两个大小相同的正方形矩阵A,B.多次询问,每次求乘后矩阵的一个子矩阵所有元素的和.

解法:

  首先想到暴力.

    预处理N^3,询问模拟扫,这常数简直瞬间爆炸啊

  当然是可以优化的.

    列出子矩阵的元素表达式,就会发现有一些元素//矩阵乘法2 (Codevs No.3147)
//矩阵乘法
#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn=2010;
int map1[maxn][maxn];
int map2[maxn][maxn];
long long ans;
int N,M;
int a,b,c,d;
int main()
{
    scanf("%d %d",&N,&M);
    for(int i=1;i<=N;i++)
    {
        for(int j=1;j<=N;j++)
        {
            scanf("%d",&map1[i][j]);
            map1[i][j]+=map1[i-1][j];
        }
    }
    for(int i=1;i<=N;i++)
    {
        for(int j=1;j<=N;j++)
        {
            scanf("%d",&map2[i][j]);
            map2[i][j]+=map2[i][j-1];
        }
    }
    for(int i=1;i<=M;i++)
    {
        ans=0;
        scanf("%d %d %d %d",&a,&b,&c,&d);
        for(int i=1;i<=N;i++)
        {
            int sumxmap2=map2[i][max(b,d)]-map2[i][min(b,d)-1];
            int sumymap1=map1[max(a,c)][i]-map1[min(a,c)-1][i];
            ans+=(long long)sumxmap2*sumymap1;
        }
        printf("%lld\n",ans);
    }
    return 0;
}的乘积可以做乘法分配律

    所以直接放弃求出子矩阵的确切值,按照分配律的特点组合数据.

    我们对A(乘法的时候乘行)进行列前缀和,对B(乘法的时候乘列)进行行前缀和

    最后所有元素的和就可以表示成sigma((A[i][Dbound]-A[i][Ubound-1])*(B[i][Rbound]-B[i][Lbound-1]));

    (Ubound,Dbound,Lbound,Rbound表示小矩阵的上下左右)

 1 //矩阵乘法2 (Codevs No.3147)
 2 //矩阵乘法
 3 #include<stdio.h>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn=2010;
 7 int map1[maxn][maxn];
 8 int map2[maxn][maxn];
 9 long long ans;
10 int N,M;
11 int a,b,c,d;
12 int main()
13 {
14     scanf("%d %d",&N,&M);
15     for(int i=1;i<=N;i++)
16     {
17         for(int j=1;j<=N;j++)
18         {
19             scanf("%d",&map1[i][j]);
20             map1[i][j]+=map1[i-1][j];
21         }
22     }
23     for(int i=1;i<=N;i++)
24     {
25         for(int j=1;j<=N;j++)
26         {
27             scanf("%d",&map2[i][j]);
28             map2[i][j]+=map2[i][j-1];
29         }
30     }
31     for(int i=1;i<=M;i++)
32     {
33         ans=0;
34         scanf("%d %d %d %d",&a,&b,&c,&d);
35         for(int i=1;i<=N;i++)
36         {
37             int sumxmap2=map2[i][max(b,d)]-map2[i][min(b,d)-1];
38             int sumymap1=map1[max(a,c)][i]-map1[min(a,c)-1][i];
39             ans+=(long long)sumxmap2*sumymap1;
40         }
41         printf("%lld\n",ans);
42     }
43     return 0;
44 }
时间: 2024-08-27 10:41:51

矩阵乘法2 (Codevs No.3147)的相关文章

[CODEVS 3147] 矩阵乘法 2

描述 给出两个n*n的矩阵,m次询问它们的积中给定子矩阵的数值和. http://codevs.cn/problem/3147/ 分析 直接 n3 的矩阵乘法肯定超时, 要采用前缀和优化 row[s1] - row[t1] col[s2] - col[t2] (s1, s2) – (t1, t2) row[x] * col[y] 表示用第 x 行的所有元素去乘第 y 行的所有元素. ==> = row[s1] * col[s2] + row[s1] * col[s2+1] + - + row[s

[codevs 1482]路线统计(矩阵乘法)

题目:http://codevs.cn/problem/1482/ 分析:很像“经过K条边的最短路径条数”.但有所不同,那就是不是边数固定,而是路径总长度固定.看似不能用矩阵乘法了……但注意到每条边的长度<=5,所以可以把每个点拆成5个,每条边的边权都为1,那么路径总长度固定也就转成了边数固定.然后矩阵乘法秒之(集训队论文2008)

矩阵乘法快速幂 codevs 1250 Fibonacci数列

codevs 1250 Fibonacci数列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 定义:f0=f1=1, fn=fn-1+fn-2(n>=2).{fi}称为Fibonacci数列. 输入n,求fn mod q.其中1<=q<=30000. 输入描述 Input Description 第一行一个数T(1<=T<=10000). 以下T行,每行两个数,n,q(n<=109, 1<

codevs矩阵乘法系列

T1:矩阵乘法板子题,练手. #include <map> #include <set> #include <cmath> #include <ctime> #include <queue> #include <stack> #include <cstdio> #include <string> #include <vector> #include <cstdlib> #include

矩阵乘法 codevs 1287 矩阵乘法

1287 矩阵乘法 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容.当然,小明上课打瞌睡也没问题,但线性代数的习题可是很可怕的.小明希望你来帮他完成这个任务. 现在给你一个ai行aj列的矩阵和一个bi行bj列的矩阵,要你求出他们相乘的积(当然也是矩阵).(输入数据保证aj=bi,不需要判断) 矩阵乘法的定义: 1. 矩阵A乘以B的

codevs 3332 数列 (矩阵乘法)

/* 裸地矩阵乘法 矩阵很好想的 1 1 0 0 0 1 1 0 0 */ #include<iostream> #include<cstring> #include<cstdio> #define mod 1000000007 #define ll long long using namespace std; int T,n; ll f[4][4],a[4][4]; void mul(ll a[4][4],ll b[4][4]) { ll c[4][4]; memse

【日常学习】codevs1287 矩阵乘法题解

转载请注明出处 [ametake版权所有]http://blog.csdn.net/ametake欢迎来看. 先上题目 题目描述 Description 小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容. 当然,小明上课打瞌睡也没问题,但线性代数的习题可是很可怕的.小明希望你来帮他完成这个任务. 现在给你一个ai行aj列的矩阵和一个bi行bj列的矩阵,要你求出他们相乘的积(当然也是矩阵). (输入数据保证aj=bi,不需要判断) 矩阵乘法的定义:

那条矩阵乘法的不归路——数列

话说今天搜矩阵相乘,没有一个人用pascal写,是不是学到矩阵相乘的孩子都果断转c++了...我可是有良心的写博人,当然附上pascal代码 故事开始了 今天看到这样一个题 a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1]  (x>3) 求a数列的第n项对1000000007(10^9+7)取余的值. 然后是它的数据范围 对于30%的数据 n<=100: 对于60%的数据 n<=2*10^7: 对于100%的数据 T<=100,n<=2*10^9: 当我

矩阵乘法的Strassen算法详解

题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数和另一个矩阵A的行数相等时才能定义.如A是m×n矩阵和B是n×p矩阵,它们的乘积AB是一个m×p矩阵,它的一个元素其中 1 ≤ i ≤ m, 1 ≤ j ≤ p. 值得一提的是,矩阵乘法满足结合律和分配率,但并不满足交换律,如下图所示的这个例子,两个矩阵交换相乘后,结果变了: 下面咱们来具体解决这个矩阵相乘的问题. 解法一.暴力解法 其实,通过前面的分析