最大字段和(分治与递归)

【问题描述】使用分治递归算法解最大子段和问题,具体来说就是,将序列分为长度相等的左右两段,分别求出这两段的最大子段和,包含左右部分子段的最大子段和,求这三种情况得到的最大子段和的最大值。

【输入形式】在屏幕上输入一个序列元素,包含负整数、0和正整数。

【输出形式】序列的最大子段和,及得到最大子段和时的起始和终止编号。

【样例输入】

-2 11 -4 13 -5 -2

【样例输出】

20

2

4

【样例说明】

输入:6个数,元素间以空格分隔。

输出:序列的最大子段和20,得到最大子段和时的起始编号为2,终止编号为4。

【评分标准】根据输入得到准确的输出。

python实现:

def MaxSubSum(s, left, right):
    sumlen = 0
    if left == right:
        if s[left] > 0:
            sumlen = s[left]
        else:
            sumlen = 0
    else:
        center = (left+right)//2
        leftsum = MaxSubSum(s, left, center)
        rightsum = MaxSubSum(s, center+1, right)
        s1 = 0
        lefts = 0
        for i in range(center, left-1, -1):
            lefts += s[i]
            if lefts > s1:
                s1 = lefts
        s2 = 0
        rights = 0
        for j in range(center+1, right+1):
            rights += s[j]
            if rights >s2:
                s2 = rights
        sumlen = s1+s2
        if sumlen < leftsum:
            sumlen = leftsum
        if sumlen < rightsum:
            sumlen = rightsum
    return sumlen


def FindIndex(s, res, n, l, r):#遍历找下标
    for i in range(0, n):
        thissum = 0
        for j in range(i, n):
            thissum += s[j]
            if thissum == res:
                l = i
                r = j
    return l, r


def main():
    s = list(map(int, input().split()))
    n = len(s)
    res = MaxSubSum(s, 0, n-1)
    print(res)
    a = b = 1
    a, b = FindIndex(s, res, n, a, b)
    print(a+1)
    print(b+1)


if __name__ == '__main__':
    main()
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值