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;
    }
  • 相关阅读:
    3、linux网络编程--网络字节序
    1、linux网络编程--网络协议
    第四篇:进程
    第五篇:进程通信
    第六篇:线程原理
    操作系统基本概念
    第一篇:基础原理篇
    第二篇:操作系统历史
    (2)linux下的简单的socket通信实例
    (3)基于linux的socket编程TCP半双工client-server聊天程序
  • 原文地址:https://www.cnblogs.com/lyqlyq/p/7103332.html
Copyright © 2011-2022 走看看