【问题标题】:Divide and conquer to find the max sum sublist of a list分而治之找到一个列表的最大和子列表
【发布时间】: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


【解决方案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

附:您的解决方案是动态规划,而不是分而治之。

【讨论】:

    猜你喜欢
    • 2018-03-18
    • 2017-06-07
    • 2016-12-08
    • 2013-01-16
    • 2021-03-20
    • 2016-06-15
    • 2016-10-16
    • 2016-05-01
    • 2017-01-12
    相关资源
    最近更新 更多