笔记(前缀和)(二维)

1.前缀和释义:

    查询以(x1,y1)为左上角端点,(x2,y2)为右下角端点的子矩阵之和

2.公式一:

(这里是二维前缀和数组公式,表示以是s[i][j]为右下端点的矩阵和)    

 s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];

3.公式二:

(这里是  查询以(x1,y1)为左上角端点,(x2,y2)为右下角端点的子矩阵之和的公式)

ans = s[x2][y2] - s[x1-1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1]

3.具体见如下代码:(不理解的可画图,会好理解很多)

#include<bits/stdc++.h>
using namespace std;//前缀和二维
//释义:查询以(x1,y1)为左上角端点,(x2,y2)为右下角端点的子矩阵之和
//构建二维前缀和数组:s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j]
//查询以(x1,y1)为左上角端点,(x2,y2)为右下角端点的子矩阵之和:
// ans = s[x2][y2] - s[x1-1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1]
const int N=10000;
int a[N][N];
int s[N][N];//前缀和数组
int searchsum(int x1,int y1,int x2,int y2){// 查询以(x1,y1)为左上角端点,(x2,y2)为右下角端点的子矩阵之和的函数 
	return s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1];//加上的是重复减去的部分 
} 
int main() {
	int n,m;
	cin>>n>>m;//原数组:n行m列
	s[0][0]=0;
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=m; j++) {
			cin>>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];//减去的是重复加的部分 
		}
	}
	int x1,x2,y1,y2;
	cin>>x1>>y1>>x2>>y2;
	cout<<searchsum(x1,y1,x2,y2);
	return 0; 
}

猜你喜欢

转载自blog.csdn.net/longzaizai_/article/details/120325171