当前位置:首页 > C++目录 > 正文内容

【算法】前缀和与差分(3)二维数组前缀和

亿万年的星光3年前 (2022-12-10)C++目录2873

0.前言

前面的一篇文章,介绍了一维数组的前缀和,这篇文章中,介绍一下二维数组的前缀和

1.定义

二维数组的前缀和就是按照二维数组求和。公式如下:

那二维前缀和中一个f[i][j]表示的意思就是
以(1,1)为左上角以(i,j)为右下角这个矩阵里面数的和,可以用下面的这个图表示

f[i][j]就是红色框的部分。

举个例子:

1 2 4 3
5 1 2 4
6 3 5 9

如果按照公式进行计算,结果是:

1  3   7  10
6  9   15  22
12  18   29  45

把上面这个图扩大

我们要求(i,j), (i,j)可以由两部分块构成 (i-1,j) 和 (i,j-1)。

不过需要注意,

  1. 如果单纯把(i-1,j)和(i,j-1)加起来,那么有一块是重复加了,就是(i-1,j-1)这一块(图中灰色区域),所以要减去它。

  2. 这个矩阵还不完整,缺少了途中红色那块,所以我们需要单独把(i,j)这个点加起来。


  3. 假设第i行第j列对应的数组为aij  ,对应的二维前缀和为sumij 。基于容斥原理,那么

sumi,j = sum i-1,j + sum i,j-1  - sum i-1,j-1   + ai,j

sum[i,j] =sum[i-1,j] + sum[i,j-1] -sum[i-1,j-1] +a[i,j]

【参考代码】

#include <bits/stdc++.h>
 
using namespace std;
 
const int MAXN = 1e3+2;
const int MAXM = 1e3+2;
int sum[MAXN][MAXM] = {};
 
int main() {
	int n,m,r,c;
	cin>>n>>m;//>>r>>c;
	
	int data;
	for (int i=1; i<=n; i++) {
		for (int j=1; j<=m; j++) {
			cin >> data;
			sum[i][j] = sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+data;
		}
	}
	
	for (int i=1; i<=n; i++) {
		for (int j=1; j<=m; j++) {
			cout << sum[i][j] << " ";
		}
		cout << endl;
	}
	
	return 0;
}







扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

判断闰年

代码参考:#include<iostream>  using namespace std; //判断闰年的函数  int leap(...

【题解】盈亏问题

【题目描述】一群人团购一件物品:如果每人出 a元,所付总金额比物价多出了x 元;如果每人少出 1元,也就是每人出a-1元,所付总金额比物价少了y元。给定 a,x,y求参与团购的人数及该物品的...

树的遍历

在应用树结构解决问题时,往往要求按照某种此项获得树中全部结点的信息,这种操作叫做树的遍历。遍历的方法有很多种。常用的有:A. 先序遍历:先访问根结点,再从左到右按照先序思想遍历各子树。B. 后序遍历:...

DEVC++中的断点调试

DEVC++中的断点调试

1.调试程序的两种方法编程的时候经常会遇到自己的输出结果跟标准结果或者预期的结果不一样,这个时候就要用到调试程序的功能。调试程序的目的有两个,一个是找出程序中的错误,另一个是监视变量的变化。2.DEV...

Code::Blocks下载安装教程

Code::Blocks下载安装教程

Code::Blocks 是一款免费、开源且跨平台的 C/C++ 集成开发环境。它支持 Windows、Linux 和 macOS 等多种操作系统,核心特点是轻量快速、纯专注于 C/C++ 开发,并内...

C++读取磁盘文件

0.前言简单介绍一下C++读取文件的基本操作。关键技术:freopen() 文件的打开函数 FILE *fp fp=fopen(文件名,使用文件方式) 例如: fp...