网格N * M上有多少个矩形正好包含k个矩形

时间:2019-03-19 02:54:53

标签: algorithm divide-and-conquer

您将得到一个0和1的网格,其尺寸为1≤ N,M ≤2500和数字0≤ K ≤6。网格中完全具有 K 个矩形的矩形的数量。

O(N ^ 2 * M)必须更快,例如O(N M log(N + M))才能起作用。我最好的办法是使用复杂度为O(N ^ 2 * M)的dp,但这很慢,有人告诉我答案是分而治之,但我听不懂。有想法吗?

1 个答案:

答案 0 :(得分:2)

获取对数因子的一种方法是水平分割,在分割线上方加上K 1 s的矩形数,加上K {{1 } s在分隔线下方(递归计算),并且对于每个水平宽度(其中有1个),矩形的数量以相同的固定宽度在分隔线上方和下方延伸的一部分。我们通过将O(|columns|^2)分为两部分来计算最后一个分区(自K开始,最大值为7,我们可能希望其中一部分为零)。我们可以在固定的宽度和底线或顶线(上下)二进制前缀总和上进行二进制搜索,可以在K ≤ 6中进行预先计算,并在O(M * N)中进行检索。

O(1)

诀窍在于,在每个递归调用中,我们将传递给f(vertical_range) = f(top_part) + f(bottom_part) + NumTopRecs(w, i) * NumBottomRecs(w, k - i) where i <- [0...k], w <- all O(M^2) widths 的一半旋转,以使水平分隔线变为垂直,这意味着我们为调用调用f(我们在2中绘制M宽度)。