给定一个 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 分,后续子任务仍继续评测:
min
算法建议:经典 O(nm) DP 即可满分。设 dp[i][j] 为以 (i, j) 为右下角的全 1 正方形最大边长,则
dp[i][j]
dp[i][j] = (A[i][j] == 1) ? 1 + min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) : 0
另外两种可参考的解法:
第 2、5 子任务中存在「差一点」的输入:最大正方形边长为 K ,但存在一个关键 0 —— 只要把它改成 1 ,答案就会跳到 K+1 。这种用例会考验 DP 在「边界 +1」类分支上的健壮性。