【问题标题】:Choose rectangles for maximizing the area选择矩形以最大化面积
【发布时间】:2017-04-21 02:23:06
【问题描述】:

我有一个任意大小的二维二进制矩阵。我想在这个矩阵中找到一组矩形,显示最大面积。约束是:

  • 矩形只能覆盖矩阵中的“0”域,而不能覆盖“1”域。
  • 每个矩形都必须与下一个矩形有一个给定的距离。

所以让我通过这个矩阵进一步说明这一点:

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 中找到对应的矩形,希望你能清楚我的问题。

【问题讨论】:

  • 限制矩形不是正方形?它可以有 area=1 吗?
  • 它不一定是正方形,但在我的代码中,我对矩形的长度和宽度有限制。出于我的目的,矩阵至少为 50x50 大,矩形的最小尺寸为 3x3。
  • 整数编程是一种选择吗?
  • 哦,实际上我不得不承认我对整数规划的了解并不多。您能否在给定的上下文中非常简要地解释一下您的意思?

标签: c++ algorithm matrix optimization geometry


【解决方案1】:

以下反例表明,即使对 最大面积 矩形的所有组合进行暴力检查也可能无法找到最佳值:

110
000
110

在上面的例子中,有 2 个最大面积的矩形,每个面积为 3,一个垂直,一个水平。您不能同时选择两者,因此如果您仅限于选择这些矩形的一个子集,那么您可以做的最好的事情是选择一个(其中一个),总面积为 3。但如果您选择了垂直 area-3 矩形,然后还取了仅由最左边的两个 0 组成的非最大 1x2 矩形,您可以获得更好的总面积 5。(这是最小间隔距离为 0 的情况;如果最小间隔距离为 1,如在您的自己的例子,那么你可以只选择最左边的 0 作为 1x1 矩形,总面积为 4,这仍然比 3 好。)

对于分隔距离为 0 的特殊情况,有一个简单的算法:您可以简单地在矩阵中的每个 0 上放置一个 1x1 矩形。当分离距离严格大于 0 时,我还没有看到快速算法,虽然我现在不太确定问题是 NP-hard 比几分钟前...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 2012-10-17
    • 2014-01-10
    • 1970-01-01
    • 2019-07-24
    相关资源
    最近更新 更多