AcWing 单调队列优化DP相关问题 135. 最大子序和

本文介绍了一种解决滑动窗口最大值问题的高效算法,通过使用单调队列来快速找到指定窗口内的最大值。这种方法适用于处理序列数据,如股票价格、传感器读数等,特别适合于实时数据分析和大数据处理场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



import sys
sys.stdin = open('data.txt', 'r')



'''
首先求序列的前缀和序列s, 将问题转换一下,以arr[i]结尾的长度不超过m的和最大
的连续子序列就是在s[i]前面的m个数中找最小的一个s[k],s[i]-s[k]就是以arr[i]
结尾的长度不超过m的和最大的连续子序列的和,其实问题就转换成了单调队列求滑动
窗口极值问题

'''


from collections import deque

n, m = map(int, input().split())
arr = list(map(int, input().split()))

pre_sum = [val for val in arr]
for i in range(1, n):
    pre_sum[i] += pre_sum[i-1]


ans = -0x7fffffff
que = deque()
for idx, val in enumerate(pre_sum):

    if idx <= m-1:
        if len(que) > 0:
            min_val = min(0, que[0][1])
        else:
            min_val = 0
    else:
        min_val = que[0][1]

    ans = max(ans, val - min_val)
    while len(que) > 0 and idx - que[0][0] >= m:
        que.popleft()

    while len(que) > 0 and que[-1][1] >= val:
        que.pop()

    que.append((idx, val))

print(ans)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值