比赛 2024.5.23练习赛 评测结果 WTTTT
题目名称 不重叠正方形 最终得分 0
用户昵称 Untitled 运行时间 4.000 s
代码语言 C++ 内存使用 17.04 MiB
提交时间 2024-05-23 21:27:54
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int const N=1010;
ll c[N][N],s[N][N],maxx;
int n,m,u[3][2];

void dfs(int dep,ll res){
	//printf("%d %d\n%d %d\n\n",u[0][0],u[0][1],u[1][0],u[1][1]);
	for (int i=1;i<=n;i++){
		for (int j=1;j<=n;j++){
			if (!s[i][j]) continue;
			if (dep>0 && (u[0][0]<=i && i<=u[0][0]+m-1 && u[0][1]<=j && j<=u[0][1]+m-1 )||( u[0][0]>=i && i+m-1>=u[0][0] && u[0][1]>=j && j+m-1>=u[0][1])) continue;
			if (dep==2 && (u[1][0]<=i && i<=u[1][0]+m-1 && u[1][1]<=j && j<=u[1][1]+m-1 )||(u[1][0]>=i && i+m-1>=u[1][0] && u[1][1]>=j && j+m-1>=u[1][1])) continue;
			if (dep==2 && maxx<res+s[i][j]){
				//printf("%d %d\n%d %d\n%d %d %d\n",u[0][0],u[0][1],u[1][0],u[1][1],i,j,res+s[i][j]);
				maxx=res+s[i][j];
			}
			if (dep<2 && !(dep>0 && u[0][0]<=i && i<=u[0][0]+m-1 && u[0][1]<=j && j<=u[0][1]+m-1 && u[0][0]>=i && i+m-1>=u[0][0] && u[0][1]>=j && j+m-1>=u[0][1])){
				u[dep][0]=i,u[dep][1]=j;
				dfs(dep+1,res+s[i][j]);
			} 
		}
	}
	return;
}

int main(){
	freopen("zfx.in","r",stdin);
	freopen("zfx.out","w",stdout);
	
	scanf("%d %d",&n,&m);
	for (int i=1;i<=n;i++){
		for (int j=1;j<=n;j++){
			scanf("%lld",&c[i][j]);
			c[i][j]+=c[i][j-1]+c[i-1][j]-c[i-1][j-1];
		}
	}
	for (int i=1;i<=n-m+1;i++){
		for (int j=1;j<=n-m+1;j++){
			s[i][j]=c[i+m-1][j+m-1]-c[i+m-1][j-1]-c[i-1][j+m-1]+c[i-1][j-1];
			//printf("%d ",s[i][j]);
		}
		//printf("\n");
	}
	
	dfs(0,0);
	printf("%lld",maxx);
	
	return 0;
}