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--;
    }
}
 
原文地址:https://www.cnblogs.com/five20/p/8992439.html