题目实质让求区间和,很明显的一道二维前缀和问题。
易错点:
1、当构造前缀和数组时,由于数据坐标是从0开始的,又考虑到数组越界问题,需要将所有坐标加一,使处理更加方便。
2、求二维前缀和的公式不用死记硬背,只要画一张图就可以理解。
上代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll maxn=5005;
const ll mod=1000000007;
ll n,r,xx,yy,x,y,v,ans,f[maxn][maxn],a[maxn][maxn];
int main(){
cin>>n>>r;
for(int i=0;i<n;++i){
scanf("%lld%lld%lld",&x,&y,&v);
x++; y++;
a[x][y]=v;
xx=max(x,xx); yy=max(y,yy);
}
for(int i=1;i<=xx;++i)
for(int j=1;j<=yy;++j)
f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1]+a[i][j];
for(int i=0;i<=xx-r;++i)
for(int j=0;j<=yy-r;++j)
ans=max(ans,f[i+r][j+r]-f[i+r][j]-f[i][j+r]+f[i][j]);
cout<<ans;
return 0;
}