最大子序列和

Posted

技术标签:

【中文标题】最大子序列和【英文标题】:Maximum Subsequence Sum 【发布时间】:2019-10-28 16:21:30 【问题描述】:

给定一个整数数组和一个阈值,确定数组中小于或等于阈值的任何子序列的最大和。对于除最多 15 个元素之外的所有元素,array[i] >= 2*array[j]array[j] >=2*array[i] 其中j!=i

threshold最大可达10^17,数组长度最大可达60array[i]最大可达10^16

这里threshold太高了,不能用普通的背包法解决。我尝试将这个数组分成三部分,然后通过回溯通过蛮力获取可能总和的列表,然后合并三个列表以查找结果。但我认为可能有更优化的方式来做到这一点。

【问题讨论】:

欢迎来到 ***!从您的问题看来,您已经有了一些工作代码;请将其添加到您的问题中,以便人们可以更轻松地提供帮助。此外,这似乎是一个优化问题,而不是关于错误的问题;这类问题最好在Code Review SE site 上提出 但您不必创建一个数组来正确存储可用的总和(这意味着“存储的最大总和的大小”)?您是否尝试将总和存储到地图/集合中? 我们可以将 sum 存储在 set 或 map 中,但可能有 2^(length of array) sums 。这种复杂性等于蛮力解决方案。 【参考方案1】:

这个问题已经过精心设置,所以所有常用方法都会用完空间。您必须使用提示。

第一步,数组大小降序排列,分成最多15个“奇怪的”和一个元素链,如b1 >= 2*b2b2 >= 2*b3等。

您可以通过将最大的放入您的链中,然后将奇怪的放入奇怪的数组中,直到找到一半大小,然后将其添加到链中,将奇怪的放入奇怪的数组中,依此类推。

p>

现在,对于最多 32768 个奇怪子集的每一个,尝试找出其余子集的哪个子集最接近您。但是,您可以使用以下观察。对于您可以选择包含的任何元素,要么它太大而无法包含,要么必须包含它。 (因为如果你不包括它,那么所有其余的加在一起会给你一个较小的数字。)这会给你最多 45 个决策点来考虑。

换句话说

for each subset of weird ones:
    for each element of the chain
        If we can add this element:
            Add it to the set we are looking at
    if sum(this set) is best so far, improve our max
return the best found.

【讨论】:

但是这个解决方案的复杂性将等于暴力解决方案。我仍然无法理解这 15 个元素有什么不同。你能帮忙吗? @NavneetSachan 不,要少得多。复杂度为O(2^a * b),其中a 是异常数字的数量,b 是链的长度。原因是对于 15 个给定的子集,您只通过链一次,然后获得最佳结果。您不会从链中获得组合爆炸式的选项。 @btilly 在您的解决方案中步骤 1 对数组进行排序后,您是否使用条件 b1 >= 2*b2, b2 >= 2*b3 构建大小为 15 的子序列。如果您可以通过示例详细说明该步骤,这对您理解该方法有很大帮助,这就是您正在尝试的吗 @Arpit 我添加了更多解释。 @btilly 谢谢!

以上是关于最大子序列和的主要内容,如果未能解决你的问题,请参考以下文章

最大子序列和,最小子序列和,最小正子序列和,最大子序列乘积

求最短连续子序列

最大连续子序列问题(tyvj1305)

最大连续子序列和

分治法求最大子序列

子序列最大和