题解 P2280 【[HNOI2003]激光炸弹】
这道题的边界 太坑了 需要你们好好思考,,,
re警告!!!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int a[5010][5010];
int main(){
int n,r;
int x,y,v;
int vm=0;
scanf("%d%d",&n,&r);
for(int i=1;i<=n;i++)
{
cin>>x>>y>>v;
a[x+1][y+1]=v;//防边界炸裂
}
for(int i=1;i<=5001;i++)
{
for(int j=1;j<=5001;j++)
{
a[i][j]=a[i-1][j]+a[i][j-1]+a[i][j]-a[i-1][j-1];//算上方和左方的总和,,,因为这道题好像只能用一个二维数组。所以请不要吝啬,大胆地在原数组上操作!
}
}
for(int i=r;i<=5001;i++)
{
for(int j=r;j<=5001;j++)
{
v=a[i][j]-a[i-r][j]-a[i][j-r]+a[i-r][j-r];
就是要理解delta[l]和delta[r+1]的作用(对于一维而言),二维也类似,草稿纸上照我的代码画一画就出来了,以上为鄙人的啰嗦,诸位大可不看。
if(v>vm)
vm=v;
}
}
printf("%d",vm);
return 0;
}