记录编号 607107 评测结果 AAAAA
题目名称 3971.不重叠正方形 最终得分 100
用户昵称 Gravatar梦那边的美好TT 是否通过 通过
代码语言 C++ 运行时间 1.939 s
提交时间 2025-10-05 16:51:26 内存使用 47.33 MiB
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
#define N 1502
using namespace std;
ll n,k,maxx,a[N][N],b[N][N],c[N][N],d[N][N],e[N][N],f[N][N],g[N][N];
int main(){
    freopen("zfx.in","r",stdin);
    freopen("zfx.out","w",stdout);
    cin>>n>>k;
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j){
            cin>>a[i][j];
            b[i][j]=b[i-1][j]+b[i][j-1]-b[i-1][j-1]+a[i][j];
            c[i][j]=b[i][j]-b[i-k][j]-b[i][j-k]+b[i-k][j-k];
        }
    for(int i=k;i<=n;i++)
    for(int j=k;j<=n;j++) d[i][j]=max(c[i][j],max(d[i-1][j],d[i][j-1]));
    for(int i=k;i<=n;++i)
    for(int j=n-k+1;j>=1;--j)
    e[i][j]=max(c[i][j+k-1],max(e[i-1][j],e[i][j+1]));
    for(int i=n-k+1;i>=1;--i)
    for(int j=k;j<=n;++j)
    f[i][j]=max(c[i+k-1][j],max(f[i+1][j],f[i][j-1]));
    for(int i=n-k+1;i>=1;--i)
    for(int j=n-k+1;j>=1;--j)
    g[i][j]=max(c[i+k-1][j+k-1],max(g[i+1][j],g[i][j+1]));
    for(int i=k;i+k<=n;++i)
    for(int j=k;j+k<=n;++j){
        maxx=max(d[n][j]+e[i][j+1]+g[i+1][j+1],maxx);
        maxx=max(d[i][j]+e[n][j+1]+f[i+1][j],maxx);
        maxx=max(d[i][n]+f[i+1][j]+g[i+1][j+1],maxx);
        maxx=max(d[i][j]+e[i][j+1]+f[i+1][n],maxx);
    }
    for(int i=2*k;i+k<=n;++i)
    for(int j=k;j<=n;++j) maxx=max(maxx,d[i-k][n]+f[i+1][n]+c[i][j]);
    for(int j=2*k;j+k<=n;++j)
    for(int i=k;i<=n;++i) maxx=max(maxx,d[n][j-k]+e[n][j+1]+c[i][j]);
    cout<<maxx<<endl;
}