nssl1304-最大正方形【二分答案】

版权声明:原创,未经作者允许禁止转载 https://blog.csdn.net/Mr_wuyongcong/article/details/89275936

正题


题目大意

一个 N N N*N 的01矩阵,求一个面积最大的全为1的正方形


解题思路

O ( n 2 ) O(n^2) 预处理 h i , j h_{i,j} 表示在 ( i , j ) (i,j) 这个位置向右有多少个连续的1。然后二分边长。
时间复杂度 : O ( n 2   l o g   n ) :O(n^2\ log\ n)


c o d e 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);
}

猜你喜欢

转载自blog.csdn.net/Mr_wuyongcong/article/details/89275936
今日推荐