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;
}