题目描述
在一个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--; } }