来源:《算法竞赛进阶指南》, HNOI2003
这道题首先是涉及到坐标位置的,就可以考虑用到二维数组来解决。并且看到位置上有数值等信息,便可以想到前缀和。
再看炸弹的范围最大可达到1e9的数据,而资源的范围仅仅只有5000,所以首先考虑的就是,是否出现全图炸弹。
然后再没有出现全图炸弹,用什么方法来搜索炸弹能炸出的最大资源,最方便的是枚举的方法。不过枚举的起始点为R的起始,与0,0的坐标为起始,相比降低了R*R次的枚举。
下面是c++代码
#include<iostream>
using namespace std;
int const N=5010;
int n,r;
int s[N][N]={0};
int main()
{
scanf("%d%d",&n,&r);
if(r>=5000) r=5001;
for(int i=0;i<n;i++)
{
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
s[x+1][y+1]+=w;//由于该题的坐标从0开始,所以用前缀和时需要加一
}
for(int i=1;i<=5001;i++)
{
for(int j=1;j<=5001;j++)
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+s[i][j];
}
int max=0;
for(int i=r;i<=5001;i++)
{
for(int j=r;j<=5001;j++)
{
int x;
x=s[i][j]-s[i-r][j]-s[i][j-r]+s[i-r][j-r];
if(x>max)max=x;
}
}
printf("%d",max);
return 0;
}