在网格 N*M 上有多少个矩形恰好包含 k 个
How many rectangles contain exactly k ones on a grid N*M
给你一个由 0 和 1 组成的网格,它的维度为 1 ≤⟩N,M ≤ 2500 和一个数字 0 ≤ K ≤ 6. 任务是统计网格中正好有K个矩形的个数。
它必须更快 O(N^2*M),像 O(NMlog(N+M)) 这样的东西会起作用。我最好的方法是复杂度为 O(N^2*M) 的 dp,但这太慢了,有人告诉我答案是分而治之,但我无法理解。有什么想法吗?
一种获取对数因子的方法是水平划分,在分界线上方添加K
的矩形个数1
s,K
个矩形的个数1
s 在分界线下方(递归计算),对于每个水平宽度,(其中有 O(|columns|^2)
个)在分界线上方和下方延伸部分相同的矩形的数量固定宽度。我们通过分成 K
的两部分分区来计算最后一个(自 K ≤ 6
以来最大为 7,我们可能希望一部分为零)。我们可以在固定宽度和底线或顶线、向上或向下、矩阵前缀和上进行二进制搜索,我们可以在 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
的一半,使水平分隔线变为垂直,这意味着我们已经为我们的调用切断了 M
(我们从中绘制 O(M^2)
宽度)在 2.
给你一个由 0 和 1 组成的网格,它的维度为 1 ≤⟩N,M ≤ 2500 和一个数字 0 ≤ K ≤ 6. 任务是统计网格中正好有K个矩形的个数。
它必须更快 O(N^2*M),像 O(NMlog(N+M)) 这样的东西会起作用。我最好的方法是复杂度为 O(N^2*M) 的 dp,但这太慢了,有人告诉我答案是分而治之,但我无法理解。有什么想法吗?
一种获取对数因子的方法是水平划分,在分界线上方添加K
的矩形个数1
s,K
个矩形的个数1
s 在分界线下方(递归计算),对于每个水平宽度,(其中有 O(|columns|^2)
个)在分界线上方和下方延伸部分相同的矩形的数量固定宽度。我们通过分成 K
的两部分分区来计算最后一个(自 K ≤ 6
以来最大为 7,我们可能希望一部分为零)。我们可以在固定宽度和底线或顶线、向上或向下、矩阵前缀和上进行二进制搜索,我们可以在 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
的一半,使水平分隔线变为垂直,这意味着我们已经为我们的调用切断了 M
(我们从中绘制 O(M^2)
宽度)在 2.