作为蒟蒻还是要写一下这个“边界上的不会被摧毁”的做法
在输入时直接把坐标往右上移动1个 x+1, y+1
然后按r找正方形,注意枚举到5001
因为我再按原来的方式枚举正方形的时候,那些现在,位于正方形右边和上边两条边上的点,其实都在里面,那些位于下边和左边的,我在处理矩阵前缀和的时候已经删去了,因为我是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;
}