9

给定一个二进制矩阵,我找到了所有1s 的最大尺寸平方子矩阵。

例如,考虑下面的二进制矩阵:

   0  1  1  0  1 
   1  1  0  1  0 
   0  1  1  1  0
   1  1  1  1  0
   1  1  1  1  1
   0  0  0  0  0

所有设置位的最大平方子矩阵是

1  1  1
1  1  1
1  1  1

我在网上搜索了解决方案,并找到了构造辅助矩阵的关系:

 If M[i][j] is 1 then
            S[i][j] = min(S[i][j-1], S[i-1][j], S[i-1][j-1]) + 1
         Else /*If M[i][j] is 0*/
            S[i][j] = 0
  1. M[][]原矩阵在哪里s[][],辅助矩阵在哪里?
  2. 这种关系意味着什么?
  3. 它有什么帮助。
4

3 回答 3

11

这是一个经典的动态规划问题。而且你还没有提到整个算法如下:

要构造辅助数组,我们必须执行以下操作:

  1. 首先将第一行和第一列从 M[][]复制到 S[][]

  2. 对于您提到的其余条目,请执行以下操作:

     If M[i][j] is 1 then
        S[i][j] = min(S[i][j-1], S[i-1][j], S[i-1][j-1]) + 1
     Else /*If M[i][j] is 0*/
        S[i][j] = 0
    
  3. 找到 S[][] 中的最大条目,并用它来构造最大尺寸的平方子矩阵

这种关系意味着什么?

为了找到最大平方,我们需要找到 1s 在不同方向上的最小延伸,并在其上加 1 以形成当前情况下平方结束的长度。

所以对于你的情况 s[][] 将是:

   0  1  1  0  1
   1  1  0  1  0
   0  1  1  1  0
   1  1  2  2  0
   1  2  2  3  1
   0  0  0  0  0

如果我们只取其中的最小值S[i][j-1], S[i-1][j],它会处理左上角方向。但是,我们还需要确保透视正方形的左上角有 1。S[i-1][j-1],根据定义,在位置 i-1,j-1 处包含一个最大正方形,其左上角设置了我们可以向上和向左的上限。因此,我们也需要考虑这一点。

希望这可以帮助!

于 2013-07-22T14:32:56.360 回答
2

您可以在线性时间内完成此操作。

声明:我可以在线性时间内构建一个数据结构,让我可以在恒定时间内检查任意矩形是否充满了 1。

证明:部分金额;取S[i][j]为 1 的上方和左侧的总数(i, j)(a,b)和之间的矩形中的个数(c,d),提供的是,(a,b)是 的上方和左侧。(c,d)S[c][d] + S[a][b] - S[a][d] - S[b][c]

现在是对数组的简单扫描:

size = 1;
For i = 0 to m-size {
  For j = 0 to n-size {
    If S[i+size][j+size] - S[i][j+size] - S[i+size][j] + S[i][j] == size*size {
      size++; j--; continue;
    }
  }
}

最后,size比最大的 1 整平方大一。

于 2013-07-22T17:46:22.843 回答
-1

您可以构建一个额外的递归函数,该函数将当前行和列作为参数,并从中查找任意大小的正方形。

在您的另一个函数中,在额外函数返回一个值后,您必须进行 2 次调用:一个来自 (row,col+1),另一个来自 (row+1,col)。

这是回溯用法,我们检查所有选项。

于 2013-07-22T14:18:01.323 回答