二维数组前缀和

article/2025/10/1 22:34:24

二维数组前缀和

对于二维数组求前缀和,我们先预处理第一行跟第一列的前缀和

第一行跟第一列的前缀和可以看作一维数组的前缀和

在这里插入图片描述

前缀和数组的0,0等于原数组的0,0,第一行为原数组第一行的前缀和,第一列为第一列的前缀和

预处理:

//原数组
int arr[110][110]={{},{0,1,2,3,4,5,6,7,8,9,0},{0,6,7,8,9,0,1,2,3,4,5},{0,1,2,3,4,5,6,7,8,9,0},{0,1,2,3,4,5,6,7,8,9,0},{0,1,2,3,4,5,6,7,8,9,0},{0,1,2,3,4,5,6,7,8,9,0},{0,1,2,3,4,5,6,7,8,9,0},{0,1,2,3,4,5,6,7,8,9,0},{0,1,2,3,4,5,6,7,8,9,0},{0,1,2,3,4,5,6,7,8,9,0},
};
int sum[110][110]={0};//前缀和数组//预处理
sum[1][1]=arr[1][1];
for(int i=2;i<=10;i++) {sum[1][i]=arr[1][i]+sum[1][i-1];sum[i][1]=arr[i][1]+sum[i-1][1];
}

遍历剩下的部分求前缀和:

在这里插入图片描述

如图不难看出 ( x , y ) (x,y) (x,y)前缀和等于 ( x − 1 , y ) (x-1,y) (x1,y)的前缀和加上 ( x , y − 1 ) (x,y-1) (x,y1)的前缀和再减去一次重叠部分 ( x − 1 , y − 1 ) (x-1,y-1) (x1,y1)的前缀和,最后再加上数组本身的 ( x , y ) (x,y) (x,y)

代码:

//原数组
int arr[110][110]={{},{0,1,2,3,4,5,6,7,8,9,0},{0,6,7,8,9,0,1,2,3,4,5},{0,1,2,3,4,5,6,7,8,9,0},{0,1,2,3,4,5,6,7,8,9,0},{0,1,2,3,4,5,6,7,8,9,0},{0,1,2,3,4,5,6,7,8,9,0},{0,1,2,3,4,5,6,7,8,9,0},{0,1,2,3,4,5,6,7,8,9,0},{0,1,2,3,4,5,6,7,8,9,0},{0,1,2,3,4,5,6,7,8,9,0},
};int sum[110][110]={0};//前缀和数组//预处理
sum[1][1]=arr[1][1];
for(int i=2;i<=10;i++) {sum[1][i]=arr[1][i]+sum[1][i-1];sum[i][1]=arr[i][1]+sum[i-1][1];
}//剩下的部分求和代码
for(int i=2;i<=10;i++){for(int o=2;o<=10;o++){sum[i][o]=sum[i-1][o]+sum[i][o-1]-sum[i-1][o-1]+arr[i][o];}
}

这样就求出来二维数组的前缀和

区间和:

求二维数组 ( x 1 , y 1 ) − > ( x 2 , y 2 ) (x1,y1)->(x2,y2) (x1,y1)>(x2,y2)的和 ( x 1 < = x 2 ) ( y 1 < = y 2 ) (x1<=x2) (y1<=y2) (x1<=x2)(y1<=y2)

求出前缀和之后,我们可以以 O ( 1 ) O(1) O(1)的速度求出来

在这里插入图片描述

( x 1 , y 1 ) − > ( x 2 , y 2 ) (x1,y1)->(x2,y2) (x1,y1)>(x2,y2)的值应该等于 ( x 2 , y 2 ) (x2,y2) (x2,y2)的前缀和减去( x 1 − 1 , y 2 ) , ( x 2 , y 1 − 1 ) x1-1,y2),(x2,y1-1) x11,y2),(x2,y11)的前缀和再加上重叠部分 ( x 1 − 1 , y 1 − 1 ) (x1-1,y1-1) (x11,y11)的和就是 ( x 1 , y 1 ) − > ( x 2 , y 2 ) (x1,y1)->(x2,y2) (x1,y1)>(x2,y2)区间的和

代码:

int n;
cin>>n;
while(n-->0){int x1,y1,x2,y2;cin>>x1>>y1>>x2>>y2;int S=sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];cout<<S<<endl;
}

n次询问,我们都能以O(1)的速度求出区间的和
在这里插入图片描述


http://chatgpt.dhexx.cn/article/3KOy8jfG.shtml

相关文章

前缀和与经典例题详解

前缀和与及经典例题详解 南昌理工ACM集训队 这是目录 前缀和与及经典例题详解前言前缀和P5638 光骓者的荣耀 二维前缀和P2004 领地选择 最大子段和P1115 最大子段和P1719 最大加权矩形 写在最后 前言 下面的例题都出自于洛谷官方算法2-1题单&#xff0c;有兴趣的同学可以去水…

前缀和(C/C++)

目录 1. 前缀和的定义 2. 一维前缀和 2.1 计算公式 2.2 用途 2.3 小试牛刀 3. 二维前缀和 3.1 用途 1. 前缀和的定义 对于一个给定的数列A&#xff0c;他的前缀和数中 S 中 S[ i ] 表示从第一个元素到第 i 个元素的总和。 如下图&#xff1a;绿色区域的和就是前缀和数组…

前缀和(C++)实现

每日一句&#xff1a;真正让人变好的选择过程都不会很舒服&#xff0c;所以人们明知道什么都不做&#xff0c;会比较轻松&#xff0c;但依旧选择追逐梦想。 前缀和 前言一、一维前缀和1.前缀和是什么&#xff1f;2.暴力做法3.前缀和求区间大小3.1如何构成前缀和的形式&#xff…

差分与前缀和

目录 前言 一、算法原理 二、算法图解 三、算法模板 四、算法应用 前言 天梯赛和省赛快开始了&#xff0c;不想拖后腿&#xff0c;边更边学习吧。 酝酿好久的第一篇博客&#xff0c;缺点不少&#xff0c;多多指教吖。 点赞鼓励一下吧&#xff0c;亲。&#x1f619;&#x1…

算法设计 - 前缀和 差分数列

一维数组前缀和的概念 前缀和的概念很简单&#xff0c;我们用一维数组的前缀和来举例&#xff0c;有如下一维数组&#xff1a; arr [1, 2, 3, 4, 5] 该数组的前缀和数组如下 preSum [1, 3, 6, 10, 15] 关系如下&#xff1a; preSum[0] arr[0]preSum[1] arr[0] arr[1]pre…

python 前缀和总结

前缀和是数据结构与算法中比较重要的知识&#xff0c;前缀和经常可以结合哈希表解决很多有意思的问题。为了方便学习&#xff0c;在这里总结leetcode中出现的前缀和问题。 525. 连续数组 给定一个二进制数组 nums &#xff08;只含有0&#xff0c;1&#xff09;, 找到含有相同…

【c++入门(2)】前缀和

大纲 1.计算前缀和 2.计算字段和 3.后缀和 4.前缀积 5.后缀积 6.例题 1.计算前缀和 基础问题&#xff1a; 思路1&#xff1a; 枚举 cin (); for (int i 1; i < q; i) {cin >> x;int sum 0;for (int j 1; j < x; j){sum a[j];}cout << sum << endl…

前缀和

【前缀和】 什么是前缀和&#xff1f;前缀和是一个数组的某项下标之前(包括此项元素)的所有数组元素的和。 设b[]为前缀和数组&#xff0c;a[]为原数组&#xff0c;根据这句话可以得到前缀和的定义式和递推式&#xff1a; 定义式递推式一维前缀和 二维前缀和 【一维前缀和】…

Java前缀和算法

一.什么是前缀和算法 通俗来讲&#xff0c;前缀和算法就是使用一个新数组来储存原数组中前n-1个元素的和&#xff08;如果新数组的当前元素的下标为n&#xff0c;计算当前元素的值为原数组中从0到n-1下标数组元素的和&#xff09;&#xff0c;可能这样讲起来有点抽象&#xff0…

基础算法——前缀和详解

秋名山码民的主页 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f64f;作者水平很有限&#xff0c;如果发现错误&#xff0c;一定要及时告知作者 前言 由于有些读者朋友私聊我&#xff0c;希望出几期基础算法的讲解&#xff0c;kmp&…

前缀和算法

文章目录 前言一、关于前缀和二、一维数组求前缀和1.求段区间前缀和2.例题&#xff1a;AcWing795. 前缀和AC代码 三、二维数组求前缀和1.求S[i,j]2.求&#xff08;x1&#xff0c;y1&#xff09;&#xff0c;&#xff08;x2&#xff0c;y2&#xff09;子矩阵的和3.例题&#xff…

前缀和详解

目录 前缀和概念前缀和代码前缀和例题题目介绍思路分析相关代码 总结 前缀和概念 前缀和&#xff1a;顾名思义&#xff0c;是要求前缀的总和&#xff0c;什么是前缀&#xff0c;对于一个存放数字的数组而言&#xff0c;前缀就是指的数组的前k项&#xff0c;因此对应的前缀和就…

前缀和与差分 图文并茂 超详细整理(全网最通俗易懂)

目录 1、前缀和2、前缀和算法有什么好处&#xff1f;3、二维前缀和4、差分5、一维差分6、二维差分 1、前缀和 前缀和是指某序列的前n项和&#xff0c;可以把它理解为数学上的数列的前n项和&#xff0c;而差分可以看成前缀和的逆运算。合理的使用前缀和与差分&#xff0c;可以将…

算法:解数独

题目内容 编写一个程序&#xff0c;通过已填充的空格来解决数独问题。 一个数独的解法遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 本题满足以下设定&#xff1a; …

算法_回溯_解数独

文章目录 解数独1.解法2.总结python算法 解数独 leetcode链接 1.解法 这道题是一个棋盘问题&#xff0c;而棋盘问题是一个典型的回溯问题。 首先思考普通人&#xff08;这里指没有受过专业训练的人&#xff09;解数独的方法&#xff0c;那就是首先在空白位置假设一个数字&a…

Java编程实战12:解数独

目录 解数独题目示例 1提示 解答解题思路完整代码 解数独 题目 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内…

使用java解数独

说明 先根据规则解数独, 规则1: 如果备选数字只有一个, 那么就填入这个数字规则2: 如果在3*3单元格中, 或者一行, 或者一列中, 某个备选数字在所有的备选数字中只出现了一次, 那么就填入这个数字. 再暴力破解数独, 依次填入备选数字, 如果不能解开, 换下一个备选数字, 直到数独…

力扣 37. 解数独

一、题目描述 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。数独部分空格内已填入了数字&#xf…

LeetCode算法 —— 解数独

题目如下所示&#xff1a; 编写一个程序&#xff0c;通过已填充的空格来解决数独问题。 一个数独的解法需遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 空白格用 ‘.…

C语言——解数独程序[源码]

用C语言写的解数独的程序。在linux下测试成功运行。 效果如图&#xff1a; 这是带解的数独&#xff0c;需要填写的部分用数字0代替。 这是程序运行后的效果图。看看&#xff0c;数独已经搞定啦&#xff5e;&#xff5e;&#xff5e; 程序源码如下&#xff1a; #include <…