给定 n\times nn×n 个字符,每个字符只能是 0
或 1
,请从中找到一个完全由 0
构成的正方形区域,且正方形的边长达到最大。
输入
5
11111
10000
10000
00000
11111 输出:3
方法1:二维前缀和
、二分
最大空方阵有一个特点:这个方阵的和为肯定 0。
我们就可以利用这个性质用二维前缀和
维护二维数组中任意两个下标之间的和,随后对于每个点二分
出该点往右下角方向最多能“延伸”(此处指在保证值仍为 0 的情况下最多能朝某个方向移动几格,以下出现的“延伸”除了特殊备注都是这个意思)几格,更新答案即可。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <limits.h>
#include <cstring>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int INF = 0x3f3f3f3f, INF_BIT = 0x3f;
const int N = 3010;
int n;
char c;
int a[N][N];
int s[N][N];
int getsum(int xa, int ya, int xb, int yb){
return s[x