题目描述
给一个 的 矩阵, 求一个面积最大的全为 的正方形子矩阵. 输出它的面积
题目解析
可以枚举每一个点,作为正方形的左上角
再枚举正方形的边长,判断区间是否都为
判断区间是否都为 ,可以用二维前缀和,只需要求出该区间的 的个数是否等于该区间的面积、
枚举正方形的边长可以直接从 开始往后枚举
代码
#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;
}