题解 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;

}