题目链接
一、题目解析
本题可以简单的视为一个边长为R的正方形在5000*5000的带权区域内进行扫描,求这个正方形所能框住的全部区域的权值的最大值。本题解法为二维前缀和。
一维前缀和数组为给定a的所有前缀之和。递推关系如下:
二、代码
#include <bits/stdc++.h>
using namespace std;
int R,N;
int s[5005][5005];
int main()
{
cin >> N >> R;
R = min(R,5001);
for(int i = 0;i < N;++i)
{
int x,y,w;
cin >> x >> y >> w;
s[x+1][y+1] += 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] + s[i][j];
}
}
int maxm = 0;
for(int i = R;i <= 5001;++i)
{
for(int j = R;j <= 5001;++j){
int cnt = s[i][j] - s[i][j - R] - s[i - R][j] + s[i - R][j - R];
maxm = max(cnt, maxm);
// cout << s[i][j] << ' ';
}
// cout << endl;
}
cout << maxm << '\n';
return 0;
}