最大正方形(square)
【问题描述】
给一个 N*N 的 01 矩阵, 求一个面积最大的全为 1 的正方形子矩阵. 输出它的面积.
【输入文件】
输入文件 square.in 的第一行包含一个正整数 N.
接下来 N 行, 每行 N 个数, 保证不是 0 就是 1. 每行相邻两个数之间没有空格.
【输出文件】
输出文件为 square.out,仅包含一个整数表示最大的全 1 子正方形矩阵的面积。
【输入样例】
2
11 11
【输出样例】
4
【数据规模和约定】
80%的数据中 N<=250;
100%的数据中 N <= 1000。
#include<bits/stdc++.h>
using namespace std;
int pre[1005][1005];
int an[1005][1005];
int n;
int work(int x)
{
int fin=x*x;
for(int i=x;i<=n;i++)
for(int j=x;j<=n;j++)
{
if((pre[i][j]-pre[i-x][j]-pre[i][j-x]+pre[i-x][j-x])==fin)
return 1;
}
return 0;
}
int main()
{
freopen("square.in","r",stdin);
freopen("square.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)
{
string a;
cin>>a;
for(int j=0;j<n;j++)
{
an[i][j+1]=a[j]-'0';
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
pre[i][j]=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]+an[i][j];
}
int l=0,r=n+1;
while(l<r)
{
int mid=(l+r+1)>>1;
if(work(mid))l=mid;
else r=mid-1;
}
cout<<l*l<<endl;
}