#include<stdio.h>
#include<string.h>
int y[5003][5003];
int main()
{
int n,r,sum=0;scanf("%d %d",&n,&r);
for (int i=0;i<n;i++)
{
int a,b,c;scanf("%d %d %d",&a,&b,&c);
y[a+1][b+1]+=c;
sum+=c;
}
for (int i=1;i<5002;i++)
for (int j=1;j<5002;j++)
{
y[i][j]=y[i-1][j]+y[i][j-1]+y[i][j]-y[i-1][j-1];
}
r-=1;
int max=0,sum1;
if (r>5000)
printf("%d",sum);
else if (r==-1)
printf("%d",0);
else
{
for (int i=1;i<=5001-r;i++)
for (int p=1;p<=5001-r;p++)
{
sum1=y[i+r][p+r]-y[i-1][p+r]-y[i+r][p-1]+y[i-1][p-1];
max=max>sum1?max:sum1;
}
printf("%d",max);
}
}
有以下收获
1.学会计算数组的内存: 如int a[5000][5000] 25 000 000*4*0.000001 约为100mb
2.在爆内存的情况下使用一个数组进行求取前缀和,即边赋值边进行覆盖求前缀和,直接莽公式不变全把数组名统一就行。
3.二维前缀和,原始数组可以从(1,1)开始赋值,便于公式计算,第一行第一列全为0,同时计算前缀和也从1.1开始
针对于此题(理解题目的精神
1.注意啦注意啦注意啦注意啦注意啦注意啦注意啦
取值范围!!!!!可以为零,范围可以为零,炸弹范围为0,离谱此时直接0个
2.炸弹可以重复投在同一位置,此时为叠加