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