首先我们的目标是让 s[i][j]表示为其左方和上方形成的矩阵所有元素的和
加上s[i-1][j]和s[i][j-1]后 s[i-1][j-1]部分重复了所以减去
最后加上a[i][j]即可完成目标
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
然后看题目要求
要求x1,y1,x2,y2围成的小正方形内的元素和
我们利用刚刚处理好的s[i][j]来操作
将是s[x2][y2]圈成的大正方形里面扣掉这两块
即s[x2][y1-1]和s[x1-1][y2]
最后加回去重复减去的s[x1-1][y1-1]即可
所以式子为 s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1];
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1010;
int a[N][N],s[N][N];
int n,m,q;
int main(){
cin>>n>>m>>q;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
}
}
while(q--){
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
cout<<s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1];
}
return 0;
}