[笔试题] 共有n个数,分别为a[i], 请选出两个连续的数段,每个数段数字个数不超过m(可以为0),且两个数段不重叠,使得两个数段的所有数相加和最大,请求出这个和?
"""
9 3
2 4 0 4 -2 4 3 -1 2
15
"""
def main(n, m, nums):
res = float('-inf')
# sumLeft = float('-inf')
# sumRight = float('-inf')
for i in range(n):
sumLeft = getSum(nums, 0, i, m)
sumRight = getSum(nums, i + 1, n - 1, m)
res = max(res, sumLeft + sumRight)
print(res)
def getSum(num, left, right, m):
# 求当前子段的小于等于m的最优
ans = float('-inf')
b = 0 # 前缀和
bNum = 0 # 当前子段中有多少数字
for i in range(left, right + 1):
if b + num[i] > num[i] or i == left:
# 如果当前子段数字加上它大于它本身 / 当前数字是数组中的第一个数字, 当前窗口添加一个数字
bNum += 1
if bNum <= m:
b += num[i]
else:
# 重新计算,此时的b即为当前值
bNum = 0
b = num[i]
else:
# 当前值就比之前的前缀和还要大,直接用当前的值
bNum = 0
b = num[i]
if b > ans:
# 如果加上负数,就不需要更新了
ans = b
if ans < 0:
ans = 0
return ans
n, m = list(map(int, input().split()))
l1 = list(map(int, input().split()))
main(n, m, l1)