方阵中的最小矩形面 - 算法

时间:2011-11-17 19:51:58

标签: algorithm math matrix

有人能指出我对以下问题的正确方法:我有一个填充了0和1值的方阵(N * N)。我需要在矩阵中找到两个矩形,因此他们检查以下条件:

  1. 矩阵中的每个元素1必须包含在至少一个矩形中;

  2. 两个矩形的曲面总和必须最小(允许其中一个矩形的表面为0)。

  3. 更具体的是矩形是什么:矩形由两个区间[a1,b1],[a2,b2]定义,并包含所有矩阵单元格(i,j),因此a1≤i≤b1 ,a2≤j≤b2。更清楚表面是什么意思:(b1-a1 + 1)·(b2-a2 + 1)。

    请你帮我解决一些想法。非常感谢。

    EDIT1:两个矩形可能重叠。

    EDIT2:允许其中一个矩形表面为0

1 个答案:

答案 0 :(得分:1)

我最初的做法。这在最佳解决方案需要重叠矩形的情况下不起作用(例如0s背景上的“+”1s)。

  
      
  1. 找到包含所有1的最小边界矩形。
  2.   
  3. 您的第一个矩形从此边界矩形的左上角延伸,您的第二个边界矩形从   这个边界矩形的右下角。
  4.   
  5. 对于边界矩形顶部和底部之间的每一行,创建从顶部延伸到R和的候选矩形   从底部到R,都是边界矩形的宽度。
  6.   
  7. 减少这两个候选项,使它们成为其中1s的最小边界矩形。这些矩形对都满足   要点1.在所有R上保持最小值。
  8.   
  9. 从第2步开始重复以覆盖整个边界矩形中的每对角,并保持整体最佳解决方案。
  10.   

在几次中止尝试有效解决方案后,在某些情况下每个都失败了,我认为找到最佳解决方案的唯一方法如下:

您只需要考虑1的边界矩形。两个边界矩形不会位于该区域之外。假设边界矩形从行(R1,C1)到(R2,C2)。

    For S1 in R1 to R2
        For S2 in S1 to R2
            For D1 in C1 to C2
                For D2 in D1 to C2
                    Reduce the rectangle (S1, C1)-(S2, C2) to be the minimum bounding rectangle of the 1s it contains
                    Reduce the rectangle (R1, D1)-(R2, D2) to be the minimum bounding rectangle of the 1s it contains that aren't already in the other rectangle. This is a candidate solution.

                    Reduce the rectangle (R1, D1)-(R2, D2) to be the minimum bounding rectangle of the 1s it contains.
                    Reduce the rectangle (S1, C1)-(S2, C2) to be the minimum bounding rectangle of the 1s it contains that aren't already in the other rectangle. This is another candidate solution.

选择您找到的最佳候选解决方案。


注意:

  • 最佳解决方案不会有重叠的矩形,因为这样的解决方案总是可以通过减少其中一个矩形来改进,因此它不再重叠。因此,我们只需要在步骤3中选择一个R(而不是每个矩形的独立最大行)。
  • 无论是按行(R)还是按列(C)分割都没关系,但不需要同时进行。对于速度,您可以在边界矩形较短且较胖时选择行,在较高和较薄时选择列。
  • 如果您找到一个候选解决方案,其中任何一个矩形都不包含任何零,那么它必须是最佳解决方案,您可以停止。