【发布时间】:2010-09-12 21:27:08
【问题描述】:
我在描述用于查找二进制数据的最大矩形区域的算法时遇到问题,其中 1 出现的频率比 0 多 k 倍。数据总是这样的 n^2 位:
例如,n = 4 的数据如下所示:
1 0 1 0
0 0 1 1
0 1 1 1
1 1 0 1
k 的值可以是 1 .. j(k = 1 表示 0 和 1 的数量相等)。
对于上面的数据示例和 k = 1 的解决方案是:
1 0 1 0 0 0 1 1
0 1 1 1
1 1 0 1
但在这个例子中:
1 1 1 0
0 1 0 0
0 0 0 0
0 1 1 1
解决方案是:
1 1 1 0
0 1 0 0
0 0 0 0
0 1 1 1
我尝试了一些蛮力算法,但对于 n > 20,它变得太慢了。你能告诉我应该如何解决这个问题吗?
正如 RBerteig 所提出的 - 问题也可以这样描述:“在一个给定的方形位图中,通过某个任意过程将单元格设置为 1 或 0,找到 1 和 0 以指定比例出现的最大矩形区域, k。”
【问题讨论】:
-
我不确定我是否理解这个问题。算法应该做什么?
-
算法应该在给定数据(n x n 位)中找到一个矩形扇区,其中“1”比“0”出现 k 倍。对于 k = 1,算法应该找到这样的数据片段,即“1”与“0”出现的次数相同。如果数据是 1 行,我会使用前缀总和,但在这种情况下,我认为我无法这样做。
-
这是对问题的正确重述吗? “在一个给定的正方形位图中,单元格被某个任意进程设置为 1 或 0,找到 1 和 0 以指定比例出现的最大矩形区域,
k。” -
对于上面给出的最后一个示例,为什么由完整的三个右侧列组成的矩形不是“解决方案”?
-
值得注意(虽然非常明显),要使比率为 k,矩形的面积必须是 (k + 1) 的倍数 - 这将消除很多矩形。
标签: c algorithm optimization binary brute-force