【发布时间】:2019-02-08 08:51:38
【问题描述】:
给定一个列表 L,列表中相邻的两个项目不能同时在子列表 S 中被选中,并且列表 L 不包含重复值。我想使用分而治之的方法设计一种算法,该算法输出一个子列表 S ,该子列表 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
【问题讨论】:
-
为什么需要分而治之?动态编程似乎更适用,它似乎是您在代码中尝试过的。
标签: python algorithm divide-and-conquer