#10. 01 矩阵 I

内存限制:128 MiB 时间限制:1000 ms 标准输入输出
题目类型:传统 评测方式:文本比较
上传者: syzoj

题目描述

给定一个 n m 列的 01 矩阵 A ,求其最大的全 1 正方形的边长。

更准确地说,求满足下式的最大整数 k

\exists\, (r, c),\ \forall\, 0 \le i, j < k,\ A[r+i][c+j] = 1.

输入格式

第一行两个整数 n, m

接下来 n 行,每行 m 个整数( 0 1 ),表示矩阵的各个元素。

输出格式

一行一个整数,表示最大全 1 子正方形的边长。

样例

样例输入

5 5
0 1 1 1 1
1 0 1 1 1
1 1 1 1 1
0 0 0 1 1
1 1 1 1 0

样例输出

3

数据范围与提示

1 \le n, m \le 1000

本题按子任务计分,每个子任务采用 min 计分 —— 任一测试点未通过则整个子任务记 0 分,后续子任务仍继续评测:

子任务 分值 数据约束
1 10 n, m \le 12 (边界、退化)
2 18 n, m \le 50 (手造图案 + 「差一点」边界)
3 20 n, m \le 200 (结构化图案 + 中等随机)
4 22 n, m \le 500 (密集随机 + 极端形状)
5 n, m \le 1000 (极限规模 + 极限「差一点」)
6 8 n, m \le 1000 (极限 edge case:挖行/列、孤立块)

算法建议:经典 O(nm) DP 即可满分。设 dp[i][j] 为以 (i, j) 为右下角的全 1 正方形最大边长,则

dp[i][j] = (A[i][j] == 1) ? 1 + min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) : 0

另外两种可参考的解法:

  • 朴素 O(n^3) :枚举左上角,依次扩边,遇到 0 即停止。
  • 直方图 + 段树 O(n^2 \log n) :逐行构建以该行为底的高度直方图;对每个高度做线段树范围最小值 + 二分,定位最大正方形边长。

第 2、5 子任务中存在「差一点」的输入:最大正方形边长为 K ,但存在一个关键 0 —— 只要把它改成 1 ,答案就会跳到 K+1 。这种用例会考验 DP 在「边界 +1」类分支上的健壮性。