正题
题目大意
一个 N ∗ N N*N N∗N的01矩阵,求一个面积最大的全为1的正方形
解题思路
先
O
(
n
2
)
O(n^2)
O(n2)预处理
h
i
,
j
h_{i,j}
hi,j表示在
(
i
,
j
)
(i,j)
(i,j)这个位置向右有多少个连续的1。然后二分边长。
时间复杂度
:
O
(
n
2
l
o
g
n
)
:O(n^2\ log\ n)
:O(n2 log n)
c o d e code code
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,h[1100][1100],l,r;
bool a[1100][1100];
bool check(int l)
{
for(int j=1;j<=n;j++)
{
int sum=0;
for(int i=1;i<=n;i++)
{
if(h[i][j]>=l) sum++;
else sum=0;
if(sum>=l) return true;
}
}
return false;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
char x;
cin>>x;
a[i][j]=x-'0';
}
for(int i=1;i<=n;i++)
{
int sum=0;
for(int j=n;j>=1;j--)
{
if(a[i][j]) sum++;
else sum=0;
h[i][j]=sum;
}
}
l=1;r=n;
while(l<=r){
int mid=(l+r)/2;
if(check(mid)) l=mid+1;
else r=mid-1;
}
printf("%d",r*r);
}