我正在阅读此http://www.cas.mcmaster.ca/~terlaky/4-6TD3/slides/DP/DP.pdf,并想知道是否存在解决分区问题的时间复杂度更高的解决方案。
从链接:
“假设给定的非负数排列S. {s1,...,sn}和整数k。如何切割 S到k或更少的范围, 以便最大限度地减少所有范围的最大总和?“
e.g。
S = 1,2,3,4,5,6,7,8,9
k = 3
通过将S切入这3个范围,最大范围(8,9)的总和为17,这是最小范围。
1,2,3,4,5 | 6,7 | 8,9
链接中建议的算法在O(kn ^ 2)中运行并使用O(kn)空间。有更高效的算法吗?
答案 0 :(得分:1)
好吧显然这是因为“偏离主题”而被关闭了!? 但它现在已经恢复,所以无论如何,我发现解决方案是二元搜索答案。对不起,我忘了其中一个限制是所有整数的总和不会超过2 ^ 64。所以让C =所有整数的累积和。然后我们可以使用
二进制搜索答案 bool isPossible(int x)
如果可以将S划分为最大分区和小于X的k个分区,则返回true。isPossible(int x)可以在O(n)中完成(通过从左到右添加所有内容,如果超过x创建一个新分区)。因此总运行时间为O(n * log(s))。