92分玄关

P1736 创意吃鱼法

yhr2013 @ 2025-01-11 14:40:35

#include<iostream>
#include<cstring>
using namespace std;
int n,m,a[2505][2505],dp[2505][2505],dp1[2505][2505],dp2[2505][2505],b[2505][2505];
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
        }
    }
    dp1[0][0]=dp2[0][0]=0;
    for(int i=1;i<=m;i++){
        dp1[1][i]=0;
    }
    for(int i=1;i<=n;i++){
        dp2[i][1]=0;
    }
    for(int i=1;i<=m;i++){
        if(a[1][i-1]==0)dp1[1][i]=dp1[1][i-1]+1;
        else dp1[1][i]=0;
    }
    for(int i=1;i<=n;i++){
        if(a[i-1][1]==0) dp2[i][1]=dp2[i-1][1]+1;
        else dp2[i][1]=0;
    }
    for(int i=2;i<=n;i++){
        for(int j=2;j<=m;j++){
            if(a[i][j-1]==0) dp1[i][j]=dp1[i][j-1]+1;
            else dp1[i][j]=0;
            if(a[i-1][j]==0) dp2[i][j]=dp2[i-1][j]+1;
            else dp2[i][j]=0;
        }
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(a[i][j]==0){
                dp[i][j]=0;
            }
            else dp[i][j]=min(dp[i-1][j-1],min(dp1[i][j],dp2[i][j]))+1;
            ans=max(ans,dp[i][j]);
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            b[i][n-j+1]=a[i][j];
        }
        for(int j=1;j<=m;j++) a[i][j]=b[i][j];
    }
    memset(dp,0,sizeof(dp));
    memset(dp1,0,sizeof(dp1));
    memset(dp2,0,sizeof(dp2));
    for(int i=1;i<=m;i++){
        dp1[1][i]=0;
    }
    for(int i=1;i<=n;i++){
        dp2[i][1]=0;
    }
    for(int i=1;i<=m;i++){
        if(a[1][i-1]==0)dp1[1][i]=dp1[1][i-1]+1;
        else dp1[1][i]=0;
    }
    for(int i=1;i<=n;i++){
        if(a[i-1][1]==0) dp2[i][1]=dp2[i-1][1]+1;
        else dp2[i][1]=0;
    }
    for(int i=2;i<=n;i++){
        for(int j=2;j<=m;j++){
            if(a[i][j-1]==0) dp1[i][j]=dp1[i][j-1]+1;
            else dp1[i][j]=0;
            if(a[i-1][j]==0) dp2[i][j]=dp2[i-1][j]+1;
            else dp2[i][j]=0;
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(a[i][j]==0){
                dp[i][j]=0;
            }
            else dp[i][j]=min(dp[i-1][j-1],min(dp1[i][j],dp2[i][j]))+1;
            ans=max(ans,dp[i][j]);
        }
    }
    cout<<ans;
}

WA on #5


|