题目
题解
求最大和可以反过来先求最小和,最大和跟最小和的数组必定首尾相连,中间不可能有空位,分成两个数组,如果最小和是从尾部跳到首部,那最大和就在数组中间,就是正常的dpmax,如果最大和是从尾部跳到首部,那最小和就在数组中间,就是正常的dpmin,sum-dpmin就是最大和;特殊情况,如果dpmin=sum就代表全是负数,也是正常的dpmax;
n = int(input())
a = list(map(int,input().split()))
dpmax = [0] * n
dpmax[0] = a[0]
dpmin = [0] * n
dpmin[0] = a[0]
sumAll = a[0]
res = dpmax[0]
for i in range(1,n):
dpmax[i] = max(dpmax[i-1] + a[i],a[i])
dpmin[i] = min(dpmin[i-1] + a[i],a[i])
sumAll += a[i]
if min(dpmin) == sumAll:
res = max(dpmax)
print(res)
else:
for i in range(n):
dpmin[i] = sumAll - dpmin[i]
print(max(max(dpmax),max(dpmin)))