【问题标题】:Disjoint maxsubarray with alternate signs具有交替符号的不相交的 maxsubarray
【发布时间】:2014-02-19 00:43:12
【问题描述】:

我想找到一种算法来找到具有交替符号(不一定是连续的)的最大不相交子数组,例如在 (2, -3, 4., 5, -4, 3, -3, 5, - 2, 1) 返回最大和为 7,子数组为 (5,-3,5)

我使用 dp 尝试过这样的事情:

    A=[2,-3,4,5,-4,3,-3,5,-2,1]

    m = A[0]
    flag = A[0]    #flag has the same sign of the previously taken element
    maximum = m    #temporary maxsum

    for i in range(1,10):
        if A[i]>0 and flag<0 or A[i]<0 and flag>0: #i look only for alternate signs
             m = max(m ,A[i]+m)
             if m > maximum:
                   flag = -flag
                    maximum = m
             else:
                   if A[i]>maximum:
                   maximum=A[i]
                   flag=-flag


     print(maximum)

它给出了 7 但这只是一个巧合

我是否必须使用另一个嵌套的 For 才能正确比较每个可能的子数组?

【问题讨论】:

  • 您能更详细地解释一下为什么应该从您的示例数组中获取 (5,-3,5) 吗?
  • 它是按照 A 的索引顺序(但不一定是连续的)选择交替符号元素制成的子数组,它具有最大的总和。抱歉,如果不清楚。

标签: python dynamic-programming arrays


【解决方案1】:
A=[2,-3,4,5,-4,3,-3,5,-2,1]
dp = [[([], 0), ([], 0)]]
for i, x in enumerate(A):
    curr = list(dp[-1])
    if x < 0 and curr[0][1] + x > curr[1][1]:
        curr[1] = (curr[0][0] + [i], curr[0][1] + x)
    elif x > 0 and curr[1][1] + x > curr[0][1]:
        curr[0] = (curr[1][0] + [i], curr[1][1] + x)
    dp.append(curr)

print dp[-1][0]

这将打印一个元组,其中包含要获取的元素的索引以及最大总和。

dp 中的每个元素代表列表中该点的最佳解决方案,用于下一个数字需要为正数(第一个元素)和下一个数字需要为负数(第二个元素)的情况。在这些最佳解决方案中的每一个中,我们都有一个到达该点的索引列表,以及最大总和。答案总是来自dp 中最近获取的数字为正数的最后一个元素。

如果您不需要跟踪使用的元素:

A=[2,-3,4,5,-4,3,-3,5,-2,1]
dp = [[0, 0]]
for i, x in enumerate(A):
    curr = list(dp[-1])
    if x < 0 and curr[0] + x > curr[1]:
        curr[1] = curr[0] + x
    elif x > 0 and curr[1] + x > curr[0]:
        curr[0] = curr[1] + x
    dp.append(curr)

print dp[-1][0]

【讨论】:

  • 谢谢,这正是我想要的,非常感谢。
猜你喜欢
  • 1970-01-01
  • 2018-08-15
  • 2018-10-03
  • 1970-01-01
  • 1970-01-01
  • 2019-02-21
  • 2012-09-03
  • 1970-01-01
  • 2018-05-31
相关资源
最近更新 更多