如果你错了#9但是讨论了m>=n
查看原帖
如果你错了#9但是讨论了m>=n
421149
how_long_can_it_be楼主2024/7/27 12:06

不知道有多少人和我是一样的写法(至少我现在还没看到)

如果你最后那两个for循环的范围不是按照很多题解里的[k,m][k,m],而是[1,m−k][1,m-k]的话,那么你和我一样错了。循环的开始不应该是1,而是0!!

比如说某个子区域的左上角是(x,y)(x,y),那么它的右下角应该是(x+m−1,y+m−1)(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;
}
2024/7/27 12:06
加载中...