题目描述
给定 n×n 个字符,每个字符只能是 0 或 1,请从中找到一个完全由 0 构成的正方形区域,且正方形的边长达到最大。
输入格式
第一行:单个整数表示 nn;
接下来有n×n 个字符,表示给定的字符方阵,只由 0 及 1 构成。
输出格式
单个整数:表示只由 0 构成的最大方阵边长。
数据范围
对于 30% 的数据,1≤n≤50;
对于 60% 的数据,1≤n≤500;
对于 100% 的数据,1≤n≤3000。
样例数据
输入:
5
11111
10000
10000
00000
11111
输出:
3
输入:
2
11
11
输出:
0
题解:
假设dp[i][j]表示以 (i,j) 为右下角,且只包含 0 的正方形的边长最大值。
map[i][j] 存储地图数据:
若map[i][j]==1,,则 dp[i][j] = 0,因为当前位置不可能在由 0 组成的正方形中;
若map[i][j]==0,则 dp[i][j] 的值由其上方、左方和左上方的三个相邻位置的 dp 值决定。具体而言,当前位置的元素值等于三个相邻的元素中的最小值加 1,状态转移方程如下:
dp[i][j]=1+min(dp[i−1][j−1],dp[i][j−1],dp[i−1][j]);
此外,还需要考虑边界条件。如果 i 和 j 中至少有一个为 0,则以位置 (i, j)(i,j) 为右下角的最大正方形的边长只能是 1,因此 dp[i][j]=1。
时间复杂度:O(n^2)
评论区