题目大意:输入一个N与R,之后N行输入每个炸弹的坐标与价值,问你在边长为N的正方形下什么时候价值最大
思路:二维前缀和,画图利用公式v[i][j]=v[i-1][j]+v[i][j-1]-v[i][j]+val得出每个点到(0,0)的总价值,再利用两个for循环寻找正方形内价值即可
代码如下:#include

using namespace std;
int v[5000][5000]={0};
int sumv[5000][5000]={0};
int main()
{
int n,r,i;
cin>>n>>r;
int a,b,val;
int maxx=r,maxy=r;//边界,不能设为0,不然输入的时候坐标输入小于R的时候for循环就不会找正方形了
for(i=0;i<n;i++){
cin>>a>>b>>val;
a++,b++;
v[a][b]=val;
maxx=max(a,maxx);
maxy=max(b,maxy);
}
for(i=1;i<=maxx;i++){
for(int j=1;j<=maxy;j++){
v[i][j]+=v[i-1][j]+v[i][j-1]-v[i-1][j-1];//求二维前缀和
}
}
int ans=0;//最大价值
for(i=r;i<=maxx;i++){
for(int j=r;j<=maxy;j++){
ans=max(ans,v[i][j]-v[i-r][j]-v[i][j-r]+v[i-r][j-r]);//看当前正方形内的价值是否为最大价值,是就ti'h
}
}
cout<<ans;
return 0;
}