最大子序列和

63 篇文章 1 订阅
41 篇文章 2 订阅

给定一个整数序列,a0, a1, a2,…, an(序列项可以为负数),求其中最大的子序列和,如果所有整数都是负数,那么最大子序列和为0;

  • 首先定义两个变量:max_so_farmax_ending_here

  • 然后从左到右开始遍历输入序列,其中:max_ending_here用以表示序列中截止到当前位置的最大子序列和,max_so_far则是通过冒泡排序的方式获取max_ending_here的最大值

  • 如何判断当前值是否位置最大子序列中,判断条件如下:max_ending_here + list[i] >= 0

  • 如果当前位置值被加入到了最大子序列中,则将当前位置索引记录,并赋予pos,记住pos即是最大子序列的开始索引

算法如下,具体逻辑参见注释

def find_mss(list):
    # 最大子序列和开始位置
    start_pos = -1
    # 最大子序列和结束位置
    end_pos = -1
    pos = -1
    # 最大子序列和
    max_so_far = 0
    # 截止到当前位置的最大子序列和
    max_ending_here = 0

    for i in range(0, len(list)):
        # 判断当前值是否可以添加到最大和子序列中
        if max_ending_here + list[i] < 0:
            max_ending_here = 0
            pos = -1
        else:
            max_ending_here = max_ending_here + list[i]
            # 只有pos等于-1时,才做赋值处理,即:第一次将当前位置的值添加到最大子序列中时的索引
            if pos == -1:
                pos = i

        # 冒泡比较,max_so_far确保始终是最大的
        if max_so_far < max_ending_here:
            max_so_far = max_ending_here
            start_pos = pos
            end_pos = i

    print("Maximum sum subsequence : "),
    for i in range(start_pos, end_pos + 1):
        print(list[i]),

    print("\nSum : %s" % max_so_far)


if __name__ == "__main__":
    lst = [int(x) for x in input().split()]
    find_mss(lst)

http://www.edufyme.com/code/?id=072b030ba126b2f4b2374f342be9ed44

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值