微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

最大和递增子序列但输出是一个列表

如何解决最大和递增子序列但输出是一个列表

编写一个递归程序来查找构成给定数组的最大和子序列之和的元素列表,使得子序列中的整数按升序排序。

例如,如果输入是{1,101,2,3,100,4,5},那么输出应该是[1,100](1+2+3+100是最大和)

我试过了,但我认为它根本没有帮助(我还没有进行动态编程,我认为这段代码对我的问题没有帮助)。

s = [3,1,6,8,10]
rez=[]
max_prev=0
for i in range(len(s)):
    if s[i]>max_prev:
        max_prev=s[i]
        rez.append(s[i])
print(rez) 

解决方法

您可以构建一个升序序列列表(即列表列表),然后使用 max() 获得总和最大的那个:

A = [1,101,2,3,100,4,5]

series = [A[:1]]
for a in A[1:]:
    more = [s+[a] for s in series if s[-1]<=a] # add series where ascending
    series.extend([[a]]+more)                  # each value starts a new series

result = max(series,key=sum)
print(result)
# [1,100]

[编辑] 为了提高内存效率,您可以使用递归方法,在该方法中,与包含使用它的子集相比,跳过第一个元素的子集的最大值(剩余元素大于第一个元素) ).

def maxAscendingSum(A):
    if len(A)<2: return A
    skipping  = maxAscendingSum(A[1:])
    using     = A[:1] + maxAscendingSum([a for a in A[1:] if a>A[0]])
    return max((skipping,using),key=sum)

为了使递归函数更加高效,您可以使用记忆功能来跟踪以前的结果并避免多次执行相同的工作:

def maxAscendingSum(A,memo=None):
    if len(A)<2: return A
    if memo is None: memo = dict()
    key = tuple(A)
    if key not in memo:
        skipping  = maxAscendingSum(A[1:],memo)
        using     = A[:1] + maxAscendingSum([a for a in A[1:] if a>A[0]],memo)
        memo[key] =  max((skipping,key=sum)
    return memo[key]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。