【发布时间】: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 算法。
直到我的方法是这样的
- 我使用 DP 在几乎 O(n^2) 时间内从每个单元格 (i,j) 开始预计算最大子矩形的边。
- 将每个查询的答案存储在网格 ans[M][M] 中(目前我在 O(n^3)=1 秒内完成大约 10^9 个原子操作,这是不可能的)
- 然后在 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