我有一个任意大小的二维二进制矩阵。我想在这个矩阵中找到一组矩形,显示最大面积。约束是:
让我用这个矩阵进一步说明这一点:
1 0 0 1
0 0 0 0
0 0 1 0
0 0 0 0
0 1 0 0
让两个矩形之间的最小距离为1.因此,最佳解决方案是选择带角(1,0) - (3,1)和(1,3) - (4,3)的矩形。这些矩形是最小的。彼此相距1个场并且它们不位于“1”场。此外,该解决方案获得了最大区域(6 + 4 = 10)。
如果最小距离为2,则最佳值为(1,0) - (4,0)和(1,3) - (4,3),区域4 + 4 = 8。
直到现在,我找到了类似于这篇文章的矩形: Find largest rectangle containing only zeros in an N×N binary matrix
我将所有这些矩形保存在一个列表中:
list<rectangle> rectangles;
与
struct rectangle {
int i,j; // bottom left corner of rectangle
int width,length; // width=size in neg. i direction, length=size in pos. j direction
};
直到现在,我只考虑过蛮力方法,但当然,我对此并不满意。
我希望你能给我一些关于如何在我的list
找到相应矩形的提示和提示,我希望你的问题很明确。
答案 0 :(得分:2)
以下反例表明,即使对最大面积矩形的所有组合进行强力检查也无法找到最佳值:
110
000
110
在上面的例子中,有2个最大区域矩形,每个区域3,一个垂直和一个水平。你不能同时选择这两个,所以如果你只能选择这些矩形的一个子集,那么你所能做的最好就是选择一个总面积为3的一个。但如果你选择了垂直区域 - 3个矩形,然后也取非最大的1x2矩形,只包含最左边的两个0,你可以得到一个更好的总面积5.(这是最小间隔距离为0;如果最小间隔距离是1,就像你自己的例子一样,那么你可以选择最左边的0作为1x1矩形,总面积为4,这仍然优于3。)
对于分隔距离为0的特殊情况,有一个简单的算法:您可以简单地在矩阵中的每个0上放置1x1矩形。当分隔距离严格大于0时,我还没有看到快速算法,尽管我现在不太确定这个问题是NP难的,而不是几分钟之前...