正题
题目大意
一个N∗NN*NN∗N的01矩阵,求一个面积最大的全为1的正方形
解题思路
先O(n2)O(n^2)O(n2)预处理hi,jh_{i,j}hi,j表示在(i,j)(i,j)(i,j)这个位置向右有多少个连续的1。然后二分边长。
时间复杂度:O(n2logn):O(n^2\ log\ n):O(n2 log n)
codecodecode
#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);
}