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;
    }
  • 相关阅读:
    《痕迹识人,面试读心》培训总结之一
    傲游与视频网站广告之战的思考
    EMLS项目推进思考
    二级证丢失如何找回
    Mathematica 讲座
    泊松方程解法
    Windows核心编程-作业
    Win7多用户同时登陆
    C语言文件操作类型速查
    openMP的一点使用经验
  • 原文地址:https://www.cnblogs.com/lyqlyq/p/7103332.html
Copyright © 2011-2022 走看看