记录编号 607142 评测结果 AAAAA
题目名称 3971.不重叠正方形 最终得分 100
用户昵称 Gravatar梦那边的美好BP 是否通过 通过
代码语言 C++ 运行时间 1.882 s
提交时间 2025-10-07 08:04:09 内存使用 34.04 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=1003;
int n,m;
ll arr[N][N],s[N][N];
ll sk[N][N],a[N][N],b[N][N],c[N][N],d[N][N];
ll ans=0;
int main() {
//	freopen("zfx.in","r",stdin);
//	freopen("zfx.out","w",stdout);
	cin>>n>>m;
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++) {
			cin>>arr[i][j];
			s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+arr[i][j];
		}
	}
	for(int i=m;i<=n;i++){
		for(int j=m;j<=n;j++){
			sk[i][j]=s[i][j]-s[i][j-m]-s[i-m][j]+s[i-m][j-m];
		}
	}
	for(int i=m;i<=n;i++){
		for(int j=m;j<=n;j++){
			a[i][j]=max(sk[i][j],max(a[i][j-1],a[i-1][j]));
		}
	}
	for(int i=m;i<=n;i++){
		for(int j=n-m+1;j>=1;j--){
			b[i][j]=max(sk[i][j+m-1],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]=max(sk[i+m-1][j],max(c[i+1][j],c[i][j-1]));
		}
	}
	for(int i=n-m+1;i>=1;i--){
		for(int j=n-m+1;j>=1;j--){
			d[i][j]=max(sk[i+m-1][j+m-1],max(d[i+1][j],d[i][j+1]));
		}
	}
	ll ans=0;
	for(int i=m;i<=n;i++)
		for(int j=m;j<=n;j++){
			ans=max(ans,a[i-m][n]+sk[i][j]+c[i+1][n]);
			ans=max(ans,a[n][j-m]+sk[i][j]+b[n][j+1]);
		}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			ans=max(ans,a[i][j]+b[i][j+1]+c[i+1][n]);
			ans=max(ans,a[i][n]+c[i][j]+d[i+1][j+1]);
			ans=max(ans,a[i][j]+b[n][j+1]+c[i+1][j]);
			ans=max(ans,a[n][j]+b[i][j+1]+d[i+1][j+1]);
		}
	}
	cout<<ans;
	return 0;
}