不知道有多少人和我是一样的写法(至少我现在还没看到)
如果你最后那两个for循环的范围不是按照很多题解里的[k,m],而是[1,m−k]的话,那么你和我一样错了。循环的开始不应该是1,而是0!!
比如说某个子区域的左上角是(x,y),那么它的右下角应该是(x+m−1,y+m−1),要减去1,所以循环开始应该是0
详见代码
#include<bits/stdc++.h>
using namespace std;
const int N=5009;
int n,m=5001,k,a[N][N],f[N][N];
int main() {
cin>>n>>k;
for (int i=1;i<=n;++i) {
int x,y,c;
cin>>x>>y>>c;
a[x+1][y+1]+=c;
}
for (int i=1;i<=m;++i)
for (int j=1;j<=m;++j)
f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1]+a[i][j];
if (k>=m) return cout<<f[m][m]<<endl,0;
int ans=0;
for (int i=0;i<=m-k;++i)
for (int j=0;j<=m-k;++j)
ans=max(ans,f[i+k][j+k]-f[i][j+k]-f[i+k][j]+f[i][j]);
cout<<ans<<endl;
return 0;
}