什么是前缀和
数列的和时,Sn = a1+a2+a3+…an; Sn就是数列的前 n 项和。
前缀和就是新建一个数组,新建数组中保存原数组前 n 项的和。
#include<iostream>
using namespace std;
const int N=100010;
int a[N];//保存原数组
int s[N];//保存前缀和
int main() {
int n,m;
cin>>n>>m;
s[0]=0;
a[0]=0;//初始化
for(int i=1; i<=n; i++) {
cin>>a[i];
s[i]+=s[i-1]+a[i];
}
for(int i=0; i<m; i++) {
int l,r;
cin>>l>>r;
cout<<s[r]-s[l-1]<<endl;
}
return 0;
}
二维数组前缀和
S[i,j]即为图1红框中所有数的的和为:
S[i,j]=S[i,j−1]+S[i−1,j]−S[i−1,j−1]+a[i,j]
(x1,y1),(x2,y2)这一子矩阵中的所有数之和为:S[x2,y2]−S[x1−1,y2]−S[x2,y1−1]+S[x1−1,y1−1]
#include<iostream>
using namespace std;
const int N=1010;
int n,m,q;
int s[N][N];
int main() {
cin>>n>>m>>q;
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
cin>>s[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];//求出前缀和
//因为读入的就是s[i][j]所以就省掉的+a[i][j]
}
}
while(q--) {
int x1,x2,y1,y2;
cin>>x1>>y1>>x2>>y2;
cout<<s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]<<endl;
}
return 0;
}