看清题意,正方形只要边分别和x,y轴平行即可,不是一定要贴着格线的!
因为我是g[i][j] - g[i-r][j] - g[i][j-r] + g[i-r][j-r]
,按i-r正好删掉了不该有的边
注意把输入往右上移动一个,不然会访问负下标
另外, 开两个5000X5000的数组会爆内存
#include <algorithm>
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN = 5010;
int g[MAXN][MAXN],ans,sum[MAXN][MAXN],n,r;
int main() {
cin >> n >> r;
for(int i=1; i<=n; i++) {
int x, y;
cin >> x >> y;
cin >> g[x+1][y+1];
}
for(int i=1; i<=5001; i++) {
for(int j=1; j<=5001; j++) {
g[i][j] = g[i][j] + g[i-1][j] + g[i][j-1] - g[i-1][j-1];
}
}
for(int i=r; i<=5001; i++) {
for(int j=r; j<=5001; j++) {
ans = max(ans, g[i][j] - g[i-r][j] - g[i][j-r] + g[i-r][j-r]);
}
}
cout << ans << endl;
return 0;
}