【问题描述】使用分治递归算法解最大子段和问题,具体来说就是,将序列分为长度相等的左右两段,分别求出这两段的最大子段和,包含左右部分子段的最大子段和,求这三种情况得到的最大子段和的最大值。
【输入形式】在屏幕上输入一个序列元素,包含负整数、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()