Algorithm 方阵算法中的最小矩形曲面
有人能给我指出一个解决以下问题的正确方法吗:我有一个平方矩阵(N*N),里面填充了0和1的值。我需要在矩阵中找到两个矩形,因此它们检查以下条件:Algorithm 方阵算法中的最小矩形曲面,algorithm,math,matrix,Algorithm,Math,Matrix,有人能给我指出一个解决以下问题的正确方法吗:我有一个平方矩阵(N*N),里面填充了0和1的值。我需要在矩阵中找到两个矩形,因此它们检查以下条件: 矩阵中1的每个元素必须包含在至少一个矩形中 两个矩形的曲面之和必须最小(允许其中一个矩形的曲面为0) 更具体地说,矩形是什么:矩形由两个区间[a1,b1],[a2,b2]定义,并包含所有矩阵单元(i,j),如a1≤我≤b1、a2≤J≤b2。为了更清楚表面的含义:(b1-a1+1)·(b2-a2+1) 你能帮我出点主意吗。非常感谢 编辑1:两个矩形可能重
EDIT2:其中一个矩形允许曲面0我的原始方法。在最佳解决方案需要重叠矩形的情况下(例如,0背景上的“+”为1),这不起作用
你只需要考虑1s的边界矩形。两个边界矩形不会位于该区域之外。假设边界矩形从行(R1,C1)到(R2,C2)
选择您找到的最佳备选解决方案注:
- 最好的解决方案不会有重叠的矩形,因为这样的解决方案总是可以通过减少其中一个矩形使其不再重叠来改进。因此,我们只需要在步骤3中选择一个R(而不是每个矩形的独立最大行)
- 无论是按行(R)还是按列(C)拆分,都没有关系,但不需要同时执行这两项操作。为了提高速度,可以在边框短而粗时选择行,在边框高而细时选择列
- 如果您找到一个候选解决方案,其中两个矩形都不包含任何零,那么它必须是最佳解决方案,您可以停止
- 找到包含所有1的最小边界矩形
- 第一个矩形从该边框的左上角延伸,第二个边框从左上角延伸 此边框的右下角
- 对于边界矩形顶部和底部之间的每一行R,创建从顶部延伸到R和R的候选矩形 从底部到R,都是边框的宽度
- 减少这两个候选对象,使它们成为其中1的最小边界矩形。这些矩形对都满足 第1点。在所有R上保持最小值
- 重复步骤2,覆盖整个边界矩形中的每一对角,并保持最佳整体解决方案 在尝试了几次失败的有效解决方案后,我认为找到最佳解决方案的唯一方法如下:
- 最好的解决方案不会有重叠的矩形,因为这样的解决方案总是可以通过减少其中一个矩形使其不再重叠来改进。因此,我们只需要在步骤3中选择一个R(而不是每个矩形的独立最大行)
- 无论是按行(R)还是按列(C)拆分,都没有关系,但不需要同时执行这两项操作。为了提高速度,可以在边框短而粗时选择行,在边框高而细时选择列
- 如果您找到一个候选解决方案,其中两个矩形都不包含任何零,那么它必须是最佳解决方案,您可以停止
- 我最初的方法。在最佳解决方案需要重叠矩形的情况下(例如,0背景上的“+”为1),这不起作用
你只需要考虑1s的边界矩形。两个边界矩形不会位于该区域之外。假设边界矩形从行(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.