【问题标题】:Efficient Dynamic Programming rectangular queries in a boolean matrix布尔矩阵中的高效动态规划矩形查询
【发布时间】:2014-01-25 08:06:59
【问题描述】:

请任何人建议一种动态编程方法来解决 SPOJ 问题“标准问题”,链接:-http://www.spoj.com/problems/ASTDPROB/

问题陈述: 给定一个大小为 NXM 的布尔矩阵。对于所有类型为 int 低、高的 Q 查询的答案,找到只有零且位于编号为低和高的行之间的最大区域子矩形。

1 ≤ N, M ≤ 1000 
1 ≤ Q  ≤ 10^6

我需要一个 O(n^2) 或 O(n^2 * log n) dp 算法。

直到我的方法是这样的

  1. 我使用 DP 在几乎 O(n^2) 时间内从每个单元格 (i,j) 开始预计算最大子矩形的边。
  2. 将每个查询的答案存储在网格 ans[M][M] 中(目前我在 O(n^3)=1 秒内完成大约 10^9 个原子操作,这是不可能的)
  3. 然后在 O(1) 中回答所有查询。

请对第二步提出任何优化建议?

任何有更有效方法的人,也请分享。

提前致谢。

【问题讨论】:

  • 这可能是 stackoverflow.com/questions/20937580/… 的副本。此外,第一步可以通过分而治之更快地完成,我认为它也可以与第二步相结合。
  • 请详细说明@M Oehm 的解决方案如何帮助回答问题。也请分享您结合步骤 1 和步骤 2 的方法。
  • @rostok 你能说出你的想法吗?
  • 对不起。我想提出与 M Oehm 类似的涉及递归搜索的建议,但由于我们不知道 1 的数量,Lukasz 的想法更可预测。请注意,您可以有两种算法并根据输入中 1 的数量执行它们。
  • 你的意思是当数量很大时,Lukasz 的想法更好,因为直方图的高度更小。当矩阵稀疏时,M ohem 的算法是正确的。我说的对吗?

标签: algorithm query-optimization dynamic-programming multidimensional-array


【解决方案1】:

M0s 和1s 的矩阵。

计算一个矩阵S,其中S[k][l]' is the number of consecutive zeros up fromM[k][l]`。这将花费 O(n^2)。

现在对于给定的查询(lo,hi),您可以从lo 行转到hi 行。对于每一行line,通过以下方式找到从linehi 的最大矩形: - 通过S[line] 使用指针p 并跟踪可能的高度。

例如,假设S[line] = [1,2,2,1,5,6,9,2,1,4]。当p = 5 时,您应该有一个元组列表,例如: W = [0,4,5] 并由此您可以计算在p==6 处完成的矩形的大小:

max(S[line][W[0]], hi-lo+1) * (p-W[0] + 1) = 6
max(S[line][W[1]], hi-lo+1) * (p-W[1] + 1) = 10
max(S[line][W[2]], hi-lo+1) * (p-W[2] + 1) = 6

编辑:嗯,似乎有更复杂的解决方案,至少在计算 S 之后。您可以将其视为问题 H 来自:

http://www.informatik.uni-ulm.de/acm/Locals/2003/html/judge.html

这里还有一个相关的SO问题 Maximize the rectangular area under Histogram

编辑:如何使用直方图的想法。

M具有如下结构

1010100101
0001001001
0001000010
0100000000

那么S 可以自下而上计算,在这种情况下是

0301041020
3230330310
2120222202
1011111111

现在要找到一个从某条线开始直到结束的矩形,我们使用“直方图问题”。对于第二行,我们有:3230330310,这对应于表单的直方图

X X XX X  
XXX XX X  
XXX XX XX

在这里找到最大的矩形给出了起始问题中最大的矩形。

复杂性:O(n) - 直方图算法。现在,对于每个查询,我们最多检查n 行,我们有q 查询,所以:O(n^2 q)

【讨论】:

  • 请在这里给出一些如何使用直方图问题的想法。还有关于你的解决方案。 1.我认为您正在尝试计算矩形的最大可能边。 2.每个查询都消耗 O(n^2) 时间,通过记忆,我们可以在 O(n^3) 时间内完成所有查询,但仍然很慢。
  • 好的。现在我明白了,还有一件事,同样使用 dp 我们可以通过创建矩阵 [N][N] 在 O(nq) 时间内回答,但它仍然意味着大约 10 ^9 超出时间限制的操作。是否可以在 O(q log n) 内完成。谢谢你这么好地清除了我的算法。
  • 你可以实现this。它给出 O(qn log^3 n)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
相关资源
最近更新 更多