题目

Description

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

Input

  输入文件square.in的第一行包含一个正整数N.
  接下来N行, 每行N个数, 保证不是0就是1. 每行相邻两个数之间没有空格.

Output

  输出文件为square.out,仅包含一个整数表示最大的全1子正方形矩阵的面积。  

Sample Input

2
11
11

Sample Output

4
 

Data Constraint

   

Hint

【数据规模和约定】
  80%的数据中 N<=250;
  100%的数据中 N <= 1000。

 

分析

       

          矩阵前缀和

 

代码

 1 #include<iostream>
 2 #include<cmath>
 3 using namespace std;
 4 int map[1001][1001],sum[1001][1001];
 5 int ans;
 6 int main ()
 7 {
 8     int n;
 9     char c;
10     cin>>n;
11     for (int i=1;i<=n;i++)
12         for (int j=1;j<=n;j++)
13         {
14             cin>>c;
15             map[i][j]=c-'0';
16         }
17     for (int i=1;i<=n;i++)
18         for (int j=1;j<=n;j++)
19           sum[i][j]=sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1]+map[i][j];
20     for (int i=1;i<=n;i++)
21     {
22         for (int j=1;j<=n;j++)
23         {
24             for (int k=sqrt(ans);i+k-1<=n&&j+k-1<=n;k++)
25             {
26                 if (sum[i+k-1][j+k-1]-sum[i+k-1][j-1]-sum[i-1][j+k-1]+sum[i-1][j-1]==k*k)
27                   ans=max(k*k,ans);
28                 else break;
29             }
30         }
31     } 
32       cout<<ans;
33 }

 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄