• P1387 最大正方形


    题目描述

    在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长。

    输入输出格式

    输入格式:

    输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m个数字,用空格隔开,0或1.

    输出格式:

    一个整数,最大正方形的边长

    输入输出样例

    输入样例#1: 
    4 4
    0 1 1 1
    1 1 1 0
    0 1 1 0
    1 1 0 1
    
    输出样例#1: 
    2
    

    Solution:

      本题太水了($Brave-Cattle$巨佬竟然问我这题怎么做?),直接二维前缀和枚举暴力就$OK$。

      $s[i][j]$表示以$(1,1),(i,j)$为对角顶点的矩形包含的数之和,当边长为$a$的正方形内只含$1$时,则该正方形内的数之和为$a^2$,于是从大到小枚举边长,再枚举点的位置,判断$s[i][j]-s[i][j-a]-s[i-a][j]+s[i-a][j-a]$是否等于$a^2$就行了。时间复杂度$O(n^3)$,完全能过。

    代码:

    #include<bits/stdc++.h>
    #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
    using namespace std;
    const int N=105;
    int n,m,s[N][N],tot,x;
    int main(){
        ios::sync_with_stdio(0);
        cin>>n>>m;
        For(i,1,n) {
            tot=0;
            For(j,1,m)cin>>x,tot+=x,s[i][j]+=s[i-1][j]+tot;
        }
        x=n>m?m:n;
        while(x){
            For(i,x,n) For(j,x,m)
                if(s[i][j]-s[i][j-x]-s[i-x][j]+s[i-x][j-x]==x*x){cout<<x;return 0;}
            x--;
        }
    }
     
  • 相关阅读:
    classpath详解
    xml详解
    pojo、po、dto、dao、bo区别
    事务的四种隔离级别
    spring相关知识点易错
    Orm
    100+个Java项目视频教程+源码+笔记,项目经验不用愁了!
    使用TM1629A芯片驱动米字数码管
    关于安装airflow遇到的问题
    Semver(语义化版本号)扫盲
  • 原文地址:https://www.cnblogs.com/five20/p/8992439.html
Copyright © 2020-2023  润新知