比赛 国庆欢乐赛3 评测结果 ATTTT
题目名称 不重叠正方形 最终得分 20
用户昵称 zhyn 运行时间 8.002 s
代码语言 C++ 内存使用 11.09 MiB
提交时间 2025-10-05 11:57:40
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;

#define maxn 1200

#define ll long long

ll num[maxn][maxn];
ll t[maxn][maxn];
int f;
int vis[maxn][maxn];
int rec[maxn][5];
ll ans=0;
struct node{
    int z,x,y;
}u[maxn*maxn];
int n,m;

ll col(int x,int y){
    ll sum=0; 
    for(int i=x;i<x+m;i++){
        for(int j=y;j<y+m;j++){
            sum+=num[i][j];
        }
    }
    return sum;
}

void init(){
    for(int i=1;i<=n-m+1;i++){
        for(int j=1;j<=n-m+1;j++){
            t[i][j]=col(i,j);
        }
    }
}


bool check(int x,int y,int s){
    for(int i=1;i<s;i++){
        if(!(abs(x-rec[i][0])>=m||abs(y-rec[i][1])>=m)){
            return false;
        }
    }
    return true;
}

void dfs(int s,ll sum){
    if(s==4){
        ans=max(ans,sum);
        return;
    }
    for(int i=1;i<=f;i++){
        if(check(u[i].x,u[i].y,s)){
                rec[s][0]=u[i].x,rec[s][1]=u[i].y;
                dfs(s+1,sum+u[i].z);
        }
    }
}

bool cmp(node w,node e){
    return w.z>e.z;
}

int main(){
    
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    
    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>>num[i][j];
        }
    }
    
    
    init();
    f=0;
    for(int i=1;i<=n-m+1;i++){
        for(int j=1;j<=n-m+1;j++){
            u[++f].z=t[i][j],u[f].x=i;u[f].y=j;
        }
    }
    
    sort(u+1,u+1+(n-m+1)*(n-m+1),cmp);
    
    dfs(1,0);
    f=max((n-m+1)*(n-m+1),550);
    
    
    cout<<ans;
    
    return 0;
}