二维是针对于二维数组的 ,这和小学学的求阴影部分面积一样, 数学思路简单 具体要落实到代码实现
重要思路:
1. 和一维的思路一样(具体看我主页里的一维前缀和) 都是先初始化前缀和
2.用小学求阴影部分的面积就完了
例如:
3. 类比这张图 给他换成二维数组 就能很轻易地得到
前缀和公式 s[i][j] = s[i-1][j] +s[i][j-1]-s[i-1][j-1]+a[i][j];
(这里由于我还在用十年前的破电脑,奇数层面不够,画不出来详细的图,对不起了,大家可以在纸上自己画画看)
s【x】【y】我们就当作是从 数组左上角到 x,y 这个点内所有数的和 也能看成面积
4. 求某个二位数组里某个范围内的所有数的和 画图能得到公式
s[x2][y2]-s[x1-1][y2] - s[x2][y1-1] +s[x1-1][y1-1];
代码实现:
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int a[N][N],s[N][N];
int n,m,q;
int main (void)
{
cin>>n>>m>>q;
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];
}
}
while(q--)
{
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
cout<<s[x2][y2]-s[x1-1][y2] - s[x2][y1-1] +s[x1-1][y1-1];
}
return 0;
}