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

正题


题目大意

一个 N ∗ N N*N NN的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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值