使用术语矩形代替子矩阵。
蛮力方法 O(n^8)
在矩阵中取两个不同的位置 A 和 B。然后考虑矩阵中以 A 为左上角的所有矩形。类似地考虑所有以 B 为左上角的矩形。假设我们有一个长l,宽b左上角A的矩形,然后取对应的长l左上角B的矩形>,呼吸b(假设两个这样的矩形都存在)。如果两个矩形的每一位都匹配,那么我们就有一个 lb 重复的区域模式,如果 lb 大于之前看到的最大面积,则更新最大面积。
对所有 A 和 B 对重复此过程。
时间复杂度: 在不做复杂分析的前提下,假设对于矩阵中的每个点 P,对于所有以 P 为左上角的矩形,矩形的最大可能长度为 n (但这不是真的,例如考虑矩阵的最后一行和最后一列中的点)。让我们对矩形的最大可能呼吸做出类似的假设。
然后从乘积规则计算,有n^2个可能的矩形,点P为左上角。
这个估计还不错,因为根据这个,总共有 n^4 个矩形,因为矩形中有 n^2 个点,每个点有 n^2 个矩形。
实际答案为 ( (n+1) 选择 2 ) * ( (n+1) 选择 2 ),即 n^4 的顺序
所以总的来说,对于每一对,我们将比较 n^2 个矩形。和上面类似,让我们估计每个矩形中有n^2个点以便于计算。因此,对于一对点 A 和 B,我们将进行 O(n^4) 比较,因为对于每个矩形,我们需要检查它们的所有对应点。
总共有 (n^2 选择 2) 对点,其阶数为 n^4。所以我们的整体时间复杂度为 O(n^8)。
避免重复计算 O(n^6)
我们看到我们一次又一次地反复检查同一个区域。例如,考虑两个左上角分别位于 A 和 B 的矩形,长度 l 和宽度 b .当我们再次检查另一个对应的矩形时,在 A 和 B 的左上角具有长度 (l+1) 和宽度 b ,我们再次检查长l和宽b的矩形。
所以我们使用memoization来避免重复计算。
假设矩形的长度是水平测量的,宽度是垂直测量的。
考虑长 l+1 和宽 b 的矩形,左上角位于 A 和 B。现在我们需要比较矩形中对应点的所有值是否匹配。 A_r、B_r 分别指向 A 和 B 的右侧。然后,如果矩形对于所有对应点具有相同的值,则矩形的长度为 l,宽度为 b,左上角A 和 B 必须重复。同样,长 l 和宽 b 且左上角位于 A_r 和 B_r 的矩形必须匹配。
考虑下图:
时间复杂度 通过上述过程,比较两个矩形需要 O(1) 时间。因此,与上述情况相比,时间复杂度降低了 n^2 倍(这是在早期情况下比较矩形所需的时间)。所以在这种情况下 O(n^6) 时间。
让我们将 (P, m, n) 表示为具有左上角 P、长 m 和宽 m 的矩形。
去除不必要的计算 O(n^5)
在上述方法中,即使我们知道如果矩形 (A, l, b) 和 (B, l, b) 不匹配,我们也会再次比较矩形 (A, l+1, b) 和 (B, l+ 1,乙)。
所以假设现在我们有一个左上角 A 和 B 长度为 l 的矩形,那么矩形的最大可能宽度是多少?
如果每个矩形的顶行所有对应元素都不匹配,则答案为 0。但如果所有对应行都匹配,则答案为 1 + (max.breadth of rectangles of length l 但左上角在 A 和 B 下方)。
与上述方法类似,此计算将花费 O(1) 时间,因为我们需要 (A, B, l-1) 的宽度以及长度为 l 的以下矩形的宽度。
请参阅此答案Largest Square Block 以获得更清晰的信息。
时间复杂度 对于矩阵中的每一对点,我们必须存储最大值。长度 1、2、...n 的宽度。并且有 n^4 个这样的对。我们可以检查在 O(1) 时间内获得每个值。所以整体时间复杂度是O(n^5)。并找到最大值。每对矩形的每个长度的面积在这里很明显。
进一步优化 O(n^4)
假设您有两个位图副本。一个被粘在地上,另一个可以在被粘的上面移动。让我们将固定的一张称为基础,另一张称为移动位图。
现在,移动位图的左上角可以位于基址的 (n^2 - 1) 个点之一上,但移动位图位于基址顶部的情况除外。现在在每种情况下,都有一些点被遗漏了,即对于基本位图上的一些点,不会有在其顶部移动一个点,反之亦然。假设移动位图的左上角需要在其下方有一个基本位图元素。
现在以这些 (n^2 - 1) 配置的一个实例为例。对于移动位图上所有在其下方有一个基本位图点的点,让我们构造一个新矩阵,如果两个位图的顶部和底部元素相同,则它包含“Y”,否则它包含“N” .请记住,矩阵的大小与移动位图上没有基本位图元素的元素相同。
然后,基本位图和移动位图的那部分重复图案的最大面积将是包含所有 Y 的最大实心块区域,这可以在 O(n^2) 时间内完成。
我们要求的答案是所有这些 (n^2 - 1) 配置中的最大答案。
请参阅Largest rectangle containing all Y's 以进一步了解
时间复杂度 对于每个配置,构建“Y”和“N”的新矩阵需要 O(n^2) 时间,最大面积计算也需要 O(n^2) 时间.
并且有 (n^2- 1) 个这样的配置,所以总共 O(n^4) 时间。
注意 Jeff Erickson 表示可以在 O(n^3 polylog n) 时间内计算出答案。我不知道该怎么做。如果有人发布这样的算法就好了。