动态规划——环形数组的连续子数组最大和

题目

动态规划——环形数组的连续子数组最大和_第1张图片

题解

求最大和可以反过来先求最小和,最大和跟最小和的数组必定首尾相连,中间不可能有空位,分成两个数组,如果最小和是从尾部跳到首部,那最大和就在数组中间,就是正常的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)))

你可能感兴趣的:(题目分类,动态规划)