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

题目

在这里插入图片描述

题解

求最大和可以反过来先求最小和,最大和跟最小和的数组必定首尾相连,中间不可能有空位,分成两个数组,如果最小和是从尾部跳到首部,那最大和就在数组中间,就是正常的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)))
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值