题目:
题目 1508: 蓝桥杯算法提高VIP-和最大子序列
时间限制: 1Sec 内存限制: 128MB 提交: 5614 解决: 1937
题目描述
对于一个给定的长度为N的整数序列A,它的“子序列”的定义是:A中非空的一段连续的元素(整数)。你要完成的任务是,在所有可能的子序列中,找到一个子序列,该子序列中所有元素的和是最大的(跟其他所有子序列相比)。程序要求你输出这个最大值。
输入
输入文件的第一行包含一个整数N,第二行包含N个整数,表示A。
其中
1 < = N < = 100000
-10000 < = A[i] < = 10000
输出
输出仅包含一个整数,表示你算出的答案。
样例输入
5
3 -2 3 -5 4
样例输出
4
参考链接:和最大子序列,分治,包含思路
代码:
N = int(input())
A = [int(x) for x in input().split()]
def getMax(A, l, r):
if l == r:
return A[r]
else:
mid = (l+r)//2
left = getMax(A, l, mid)
right = getMax(A, mid+1, r)
maxleftborder = -1*float("inf")
maxrightborder = -1*float("inf")
leftborder = 0
rightborder = 0
for i in range(mid, l-1, -1):
leftborder += A[i]
maxleftborder = max(maxleftborder, leftborder)
for i in range(mid+1, r+1, 1):
rightborder += A[i]
maxrightborder = max(maxrightborder, rightborder)
if (maxleftborder>=0 and maxrightborder>=0):
middlesum = maxleftborder + maxrightborder
else:
middlesum = max( maxleftborder, maxrightborder)
return max(left, right, middlesum)
print(int(getMax(A, 0, N-1)))