使用替代标志脱离maxsubarray

时间:2014-02-19 00:43:13

标签: python dynamic-programming arrays

我想找到一种算法来找到具有交替符号(不一定是连续符号)的最大不相交子阵列,例如(2,-3,4,5,5,3,4,-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嵌套才能正确比较每个可能的子阵列?

1 个答案:

答案 0 :(得分:0)

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]