记录编号 607141 评测结果 AAAAA
题目名称 3971.不重叠正方形 最终得分 100
用户昵称 Gravatar梦那边的美好TE 是否通过 通过
代码语言 C++ 运行时间 0.775 s
提交时间 2025-10-07 00:22:02 内存使用 35.21 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#define int long long
using namespace std;
const int N=2010;
int s[N][N],n,m,ans;
int a[N][N],b[N][N],c[N][N],d[N][N];
int e[N],f[N],g[N],h[N],u[N][N],v[N][N];
signed main(){
	freopen("zfx.in","r",stdin);
	freopen("zfx.out","w",stdout);
	scanf("%lld %lld",&n,&m);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			long long x;scanf("%lld",&x);
			s[i][j]=s[i-1][j]+s[i][j-1]+x-s[i-1][j-1];
		}
	}
	for(int i=m;i<=n;i++){
		for(int j=m;j<=n;j++){
			a[i][j]=s[i][j]-s[i-m][j]-s[i][j-m]+s[i-m][j-m];
			a[i][j]=max(a[i][j],max(a[i-1][j],a[i][j-1])); 
		}
	}
	for(int i=m;i<=n;i++){
		for(int j=n-m+1;j>=1;j--){
			b[i][j]=s[i][j+m-1]-s[i-m][j+m-1]-s[i][j-1]+s[i-m][j-1];
			b[i][j]=max(b[i][j],max(b[i-1][j],b[i][j+1]));
		}
	}
	for(int i=n-m+1;i>=1;i--){
		for(int j=m;j<=n;j++){
			c[i][j]=s[i+m-1][j]-s[i+m-1][j-m]-s[i-1][j]+s[i-1][j-m];
			c[i][j]=max(c[i][j],max(c[i+1][j],c[i][j]));
		}
	}
	for(int i=n-m+1;i>=1;i--){
		for(int j=n-m+1;j>=1;j--){
			d[i][j]=s[i+m-1][j+m-1]-s[i-1][j+m-1]-s[i+m-1][j-1]+s[i-1][j-1];
			d[i][j]=max(d[i][j],max(d[i+1][j],d[i][j+1]));
		}
	}
	for(int i=1;i<=n-m+1;i++){
		int tmp=0;
		for(int j=m;j<=n;j++){
			tmp=max(tmp,s[i+m-1][j]-s[i-1][j]-s[i+m-1][j-m]+s[i-1][j-m]);
		}
		u[i][i+m-1]=tmp;
	}
	for(int i=1;i<=n-m+1;i++){
		int tmp=0;
		for(int j=m;j<=n;j++){
			tmp=max(tmp,s[j][i+m-1]-s[j][i-1]-s[j-m][i+m-1]+s[j-m][i-1]);
		}
		v[i][i+m-1]=tmp;
	}
	for(int i=1;i<=n;i++){
		for(int j=i+m-1;j<=n;j++){
			u[i][j]=max(u[i][j],u[i][j-1]);
			v[i][j]=max(v[i][j],v[i][j-1]);
		}
	}
	for(int i=m;i<=n;i++){
		for(int j=m;j<=n;j++){
			int x=s[i][j]-s[i-m][j]-s[i][j-m]+s[i-m][j-m];
			e[i]=max(e[i],x),f[i-m+1]=max(f[i-m+1],x),g[j]=max(g[j],x),h[j-m+1]=max(h[j-m+1],x);
		}
	}
	for(int i=1;i<=n;i++)e[i]=max(e[i],e[i-1]),g[i]=max(g[i],g[i-1]);
	for(int i=n;i>=1;i--)f[i]=max(f[i],f[i+1]),h[i]=max(h[i],h[i+1]);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			ans=max(ans,e[i]+c[i+1][j]+d[i+1][j+1]);
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			ans=max(ans,f[i]+a[i-1][j]+b[i-1][j+1]);
		}
	}	
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			ans=max(ans,g[j]+b[i][j+1]+d[i+1][j+1]);
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			ans=max(ans,h[j]+a[i][j-1]+c[i+1][j-1]);
		}
	}
	for(int i=m+1;i<=n;i++){
		for(int j=i+m-1;j<=n-m;j++){
			ans=max(ans,e[i-1]+f[j+1]+u[i][j]);
			ans=max(ans,g[i-1]+h[j+1]+v[i][j]);
		}
	}
	printf("%lld\n",ans);
	return 0;
}