AcWing <796. 子矩阵的和>

简介: 二维前缀和总结

image.png

之前讲了一维层面的前缀和数组,这次来讲讲二维的前缀和数组。而每一个位置都表示从起点开始到当前位置之内所有数的和。

image.png

我们也很容易观察到,若我们想要对其进行初始化只需要,用上部分的和加上左部分的和,由于中间部分算了两次由此需要扣掉一次,即s[i,j] = a[i, j] + s[i, j-1] + s[i-1, j] - s[i-1, j-1]。

image.png

初始化之后要求子矩阵的和就只需要用红色部分减去两个绿色的部分,最后把重复减去的部分再加回来就可以了。即 s [x1y1,x2y2] = s[x2,y2] - s[x2,y1-1] - s[x1-1,y2] + s[x1-1,y1-1]

image.png

最后上代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1010;
int a[N][N], s[N][N];
int n, m, q;
int main()
{
  scanf("%d%d%d", &n, &m, &q);
  for (int i = 1; i <= n; i++)
  {
    for (int j = 1; j <= m; j++)
    {
      scanf("%d", &a[i][j]);
    }
  }
  for (int i = 1; i <= n; i++)
  {
    for (int j = 1; j <= m; j++)  //二维前缀和的初始化
    {
      s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];
    }
  }
  while (q--)
  {
    int x1, y1, x2, y2;
    scanf("%d%d%d%d", &x1, &y1, &x2, &y2);  //求子矩阵的和
    printf("%d\n", s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1]);
  }
  return 0;
}

image.gif

目录
相关文章
|
2月前
|
C++
【PTA】​L1-048 矩阵A乘以B​ (C++)
【PTA】​L1-048 矩阵A乘以B​ (C++)
33 0
【PTA】​L1-048 矩阵A乘以B​ (C++)
【CCCC】L3-006 迎风一刀斩 (30分),几何关系,找规律 (拼合多边形==斜边等价)
【CCCC】L3-006 迎风一刀斩 (30分),几何关系,找规律 (拼合多边形==斜边等价)
131 0
|
存储
矩阵转置(mooc)用户输入矩阵阶数,然后按行输入所有矩阵元素(整数),将该矩阵转置输出。阶数应是[1,5]之间的整数,不在该区间时,显示“matrix order error”。
矩阵转置(mooc)用户输入矩阵阶数,然后按行输入所有矩阵元素(整数),将该矩阵转置输出。阶数应是[1,5]之间的整数,不在该区间时,显示“matrix order error”。
69 0
矩阵的初等变换和等价
矩阵的初等变换和等价
143 0
矩阵的初等变换和等价
|
Python
有什么方法可以快速筛选出 pitch 中的值 在0.2 &gt; x &gt; -0.2 的值?
有什么方法可以快速筛选出 pitch 中的值 在0.2 &gt; x &gt; -0.2 的值?
147 0
有什么方法可以快速筛选出 pitch 中的值 在0.2 &gt; x &gt; -0.2 的值?
【1093】Count PAT‘s (25分)【递推】
若直接暴力解会超时!! 可以先算出T的个数(一层for
86 0
【PTA】7-3 判断上三角矩阵 (15分)
【PTA】7-3 判断上三角矩阵 (15分)
2141 0
|
算法 C++
利用动态规划算法解01背包问题-&gt;二维数组传参-&gt;cpp内存管理-&gt;堆和栈的区别-&gt;常见的内存错误及其对策-&gt;指针和数组的区别-&gt;32位系统是4G
1、利用动态规划算法解01背包问题 https://www.cnblogs.com/Christal-R/p/Dynamic_programming.html 两层for循环,依次考察当前石块是否能放入背包。
1249 0