这题拿到手后,一直在纠结[5000][5000]的二维数组能不能开,后来算了下500050004=1e8B=100MB<512MB,所以是可以的。但还是不知道该怎么做,一点思路都没有╮(╯▽╰)╭ 没办法只能看题解,采用前缀和的思想,考虑二维前缀和来求解。 参考这张图来理解下面的Code:
using namespace std; #include<bits/stdc++.h> int mp[5005][5005]; int main(){ int n,r; cin>>n>>r; int xx=r,yy=r;//边界 for(int i=0;i<n;i++) { int x,y,v; cin>>x>>y>>v; mp[++x][++y]=v; xx=max(x,xx); yy=max(y,yy); } for(int i=1;i<=xx;i++) { for(int j=1;j<=yy;j++) { mp[i][j]=mp[i][j]+mp[i][j-1]+mp[i-1][j]-mp[i-1][j-1];//求前缀和 } } int ans=0; for(int i=r;i<=xx;i++) { for(int j=r;j<=yy;j++) { ans=max(ans,mp[i][j]-mp[i][j-r]-mp[i-r][j]+mp[i-r][j-r]);//求最大值 } } cout<<ans; return 0; }