簡體   English   中英

分而治之以找到列表的最大和子列表

[英]Divide and conquer to find the max sum sublist of a list

給定一個列表L,該列表中相鄰的兩個項目不能都在子列表S中被選中,並且列表L不包含重復的值。 我想設計一種使用分治法的算法,該算法輸出一個最大化其元素總和的子列表S。 例如,如果L = [1, 0, 5, 3, 2, 7, 9, 15, 6, 4, 13] ,則S = [1, 5, 7, 15, 13] 我寫的以下代碼不起作用,我認為這不是分而治之的方法。

def bestsublist(l):
    sublist = []
    n = len(l)
    totalsum = [None] * (n + 1)
    totalsum[n] = 0
    for i in range(n-1,-1,-1):
        totalsum[i] = max(l[i] + totalsum[min(i+2,n)],totalsum[min(i+1,n)])
        if l[i] + totalsum[min(i+2,n)] > totalsum[min(i+1,n)]:
            sublist.append(l[l[i] + totalsum[min(i+2,n)] - 1])
        else:
            sublist.append(l[totalsum[min(i+1,n)] - 1])

    return sublist

您的解決方案幾乎是正確的。 唯一的問題是如何構建解決方案子列表。

問題是您要在遍歷整個列表之前將其追加到列表中,因此您尚不知道是否要使用該元素。

因此,要解決此問題,只需再次遍歷該列表並構建子列表。 外觀如下:

....
for i in range(n-1,-1,-1):
    totalsum[i] = max(l[i] + totalsum[min(i+2,n)],totalsum[min(i+1,n)])

i = 0
while i < n:
   if l[i] + totalsum[min(i+2,n)] > totalsum[min(i+1,n)]:
        sublist.append(l[i])
        i += 2
    else:
        i += 1
return sublist

Ps您的解決方案是動態編程,而不是分而治之。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM