给出一个列表L,列表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
答案 0 :(得分:1)
您的解决方案几乎是正确的。唯一的问题是如何构建解决方案子列表。
问题在于您需要在遍历整个列表之前将其追加到列表上,因此您尚不知道是否要使用该元素。
因此,要解决此问题,只需再次遍历该列表并构建子列表。这是它的外观:
....
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
P.s。您的解决方案是动态编程,而不是分而治之。