JZOJ 2548. 【NOIP2011模拟9.4】最大正方形

题目

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 }

 

 

posted @ 2019-04-12 22:02  Melted_czj  阅读(150)  评论(0编辑  收藏  举报
body { background-color:whitesmoke; } // 修改背景颜色为半透明 #home,#sideBarMain>div,#blog-sidecolumn>div>div,.catListView{ background-color:rgba(255,255,255,0); } // 修改其他边框的颜色