[Jzoj] 2548.最大正方形

题目描述

给一个 N N N*N 01 01 矩阵, 求一个面积最大的全为 1 1 的正方形子矩阵. 输出它的面积

题目解析

可以枚举每一个点,作为正方形的左上角

再枚举正方形的边长,判断区间是否都为 1 1

判断区间是否都为 1 1 ,可以用二维前缀和,只需要求出该区间的 1 1 的个数是否等于该区间的面积、

枚举正方形的边长可以直接从 a n s ans 开始往后枚举

代码

#include<bits/stdc++.h>
using namespace std;

string s;
int n,ans;
int b[1005][1005];
bool a[1005][1005];

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
	  cin>>s;
	  for(int j=1;j<=s.size();j++)
	  a[i][j]=s[j-1]-48,b[i][j]+=a[i][j]+b[i-1][j]+b[i][j-1]-b[i-1][j-1];
	}
	for(int i=1;i<=n;i++)
	 for(int j=1;j<=n;j++)
	 {
	   for(int k=ans;k<=n-max(i,j)+1;k++)
	    if(b[i+k-1][j+k-1]-b[i+k-1][j-1]-b[i-1][j+k-1]+b[i-1][j-1]==k*k)
	     ans=max(ans,k);
	    else
	     break;
	 }
	cout<<ans*ans;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43909855/article/details/89218784