zoukankan      html  css  js  c++  java
  • codevs 1259 最大正方形子矩阵 WD

    1259 最大正方形子矩阵

     

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 黄金 Gold
     
     
    题目描述 Description

    在一个01矩阵中,包含有很多的正方形子矩阵,现在要求出这个01矩阵中,最大的正方形子矩阵,使得这个正方形子矩阵中的某一条对角线上的值全是1,其余的全是0。

    输入描述 Input Description

    第一行有两个整数n和m(1<=n,m<=1000)。接下来的n行,每行有m个0或1的数字。每两个数字之间用空格隔开。

    输出描述 Output Description

    只有一个整数,即这个满足条件的最大的正方形子矩阵的边长。

    样例输入 Sample Input

    4 6

    0 1 0 1 0 0

    0 0 1 0 1 0

    1 1 0 0 0 1

    0 1 1 0 1 0

    样例输出 Sample Output

    3

    数据范围及提示 Data Size & Hint
     
    #include <cstdio>
    #include <cstring>
    
    #define ref(i,x,y)for(int i=x;i<=y;i++)
    #define def(i,x,y)for(int i=x;i>=y;i--)
    #define max(a,b)a=a>b?a:b;
    
    int n,m,ans;
    int a[1001][1001],f[1001][1001],s[2][1001][1001];
    
    int main()
    {
        scanf("%d%d",&n,&m);
        ref(i,1,n)ref(j,1,m)
            scanf("%d",&a[i][j]);
        ref(i,1,n)ref(j,1,m)
            if(!a[i][j])
            {
                s[1][i][j]=s[1][i][j-1]+1;
                s[0][i][j]=s[0][i-1][j]+1;
            }
        ref(i,1,n)ref(j,1,m)
            if(a[i][j])
            {
                int p=f[i-1][j-1];
                if(p<=s[1][i][j-1]&&p<=s[0][i-1][j])
                    f[i][j]=f[i-1][j-1]+1;
                max(ans,f[i][j]);
            }
        memset(f,0,sizeof f);
        ref(i,1,n)def(j,m,1)
            if(a[i][j])
            {
                int p=f[i-1][j+1];
                if(p<=s[1][i][j+p]&&p<=s[0][i-1][j])
                    f[i][j]=f[i-1][j+1]+1;
                max(ans,f[i][j]);
            }
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    4.程序员那点事-遭窃
    3.程序员那点事-惭愧与无奈
    2.程序员那点事-迷惘与憧憬
    1.程序员那点事-抉择
    6月22日の勉強レポート
    6月20日の勉強レポート
    6月16日の勉強レポート
    6月15日の勉強レポート
    IOSアプリケーション開発環境の構築
    iOSシステム構成の纏め
  • 原文地址:https://www.cnblogs.com/lyqlyq/p/7103332.html
Copyright © 2011-2022 走看看