有人能指出我对以下问题的正确方法:我有一个填充了0和1值的方阵(N * N)。我需要在矩阵中找到两个矩形,因此他们检查以下条件:
矩阵中的每个元素1必须包含在至少一个矩形中;
两个矩形的曲面总和必须最小(允许其中一个矩形的表面为0)。
更具体的是矩形是什么:矩形由两个区间[a1,b1],[a2,b2]定义,并包含所有矩阵单元格(i,j),因此a1≤i≤b1 ,a2≤j≤b2。更清楚表面是什么意思:(b1-a1 + 1)·(b2-a2 + 1)。
请你帮我解决一些想法。非常感谢。
EDIT1:两个矩形可能重叠。
EDIT2:允许其中一个矩形表面为0
答案 0 :(得分:1)
我最初的做法。这在最佳解决方案需要重叠矩形的情况下不起作用(例如0s背景上的“+”1s)。
- 找到包含所有1的最小边界矩形。
- 您的第一个矩形从此边界矩形的左上角延伸,您的第二个边界矩形从 这个边界矩形的右下角。
- 对于边界矩形顶部和底部之间的每一行,创建从顶部延伸到R和的候选矩形 从底部到R,都是边界矩形的宽度。
- 减少这两个候选项,使它们成为其中1s的最小边界矩形。这些矩形对都满足 要点1.在所有R上保持最小值。
- 从第2步开始重复以覆盖整个边界矩形中的每对角,并保持整体最佳解决方案。
醇>
在几次中止尝试有效解决方案后,在某些情况下每个都失败了,我认为找到最佳解决方案的唯一方法如下:
您只需要考虑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.
选择您找到的最佳候选解决方案。
注意: