【发布时间】:2012-04-05 02:25:30
【问题描述】:
给定一个实数值数组A[1..n,1..n],我希望找到子数组
B = A[i..j,s..t]
1 <= i <= j <= n, 和 1 <= s <= t <= n
使得B 中的数字总和最大化。是否可以使用动态编程来解决这个问题?我与奥胡斯大学的一位 OR 教授交谈,他不知道该怎么做,并说他很难理解如何才能获得最佳的子结构质量。
但有可能吗?如果是,如何?如果不是,为什么?
我已经知道在O(n^3) 时间运行的算法,通过将其减少到n(n+1)/2 复杂性O(n) 的子问题,但这似乎有点慢。我知道最优算法会在Omega(n) 时间运行,但我希望可以使用动态编程使其在O(n^2) 时间运行。
原始问题总结
我添加此部分是因为我觉得有些人误解了我的问题的重点。原来的问题是:
- 是否可以在
O(n^2)时间使用动态规划来解决上述问题?如果是,如何?如果没有,为什么不呢?
其他问题:
我在这里添加了一个新问题。稍后可能会添加更多内容:
- 为了使用动态规划,我需要使用易于解决的子问题的解决方案(否则这一点没有实际意义)。问题的结构是这样的,如果我们取
A[1..n,1..n]的子数组B = A[1..m,1..m]其中m < n,那么数组B的最优解至多与A一样好,很简单,因为同样的解决方案在A中是可行的。使用动态规划,因此有理由问:A[1..i,1..i]的最优子数组和A[1..i+1,1..i+1]的最优子数组有什么关系?
【问题讨论】:
-
噢,多么令人兴奋。 @izomorphius 会在接下来的 24 小时内死去,让我们像可怜的老费马一样提心吊胆几个世纪!我不希望,但我担心他正在诱惑命运。我明天再来看看。
-
@HighPerformanceMark 我当然希望不会在接下来的 24 小时内死去,但如果发生这种情况,我将返回并困扰 SO 网站,直到一个聪明人写下解决方案并让我饱受折磨的灵魂得到永恒的安息。
-
@Undreren:我没有这种感觉,我只是担心izomorphius。
-
@izomorphius : 好的一面是,你在回家的路上过早死亡对我们其他人来说不再那么麻烦了;)
标签: arrays algorithm dynamic-programming