莫欺少年穷,修魔之旅在这开始—>算法提高课题解
注意⚠️
1. 下标是从1开始的,因为后面要计算前缀和
2. 同一个点可能会有多个价值w,所以要相加
#include<bits/stdc++.h>
using namespace std;
const int N = 5010;
int n,R;
int s[N][N];
int main()
{
cin>>n>>R;
while(n--)
{
int x,y,w;
cin>>x>>y>>w;
s[++x][++y]+=w;
}
//计算前缀和
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];
//枚举求最大价值和
int res=0;
for(int i=R;i<=5001;i++)
for(int j=R;j<=5001;j++)
res=max(res,s[i][j]+s[i-R][j-R]-s[i][j-R]-s[i-R][j]);
//全炸了
if(R>=5000) res=s[5001][5001];
cout<<res<<endl;
return 0;
}