二维前缀和
在区间查询之类的问题中我们经常用到一维的前缀和,一维的前缀和的公式较易写出
sum[i] = sum[i-1] + a[i]
而对于二维的前缀和的公式较为复杂
sum[i][j] += sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1]
#include<iostream>
#define N 5010
using namespace std;
int pre[N][N],n,m,x,y,z,ans;
int main()
{
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;i++)
{
scanf("%d%d%d",&x,&y,&z);
pre[++x][++y] = z;
}
for(int i=1;i<N;i++)
for(int j=1;j<=N;j++)
pre[i][j]=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]+pre[i][j];
int ans = 0;
for(int i = m;i < N;i++)
for(int j = m;j < N;j++)
ans = max(ans,pre[i][j] - pre[i-m][j] - pre[i][j - m] + pre[i - m][j - m]);
printf("%d",ans);
}