AcWing 单调队列优化DP问题 1089. 烽火传递

from collections import deque
n, m = map(int, input().split())
cost = list( map(int, input().split()) )

# dp(i) 表示前i个烽火台进行选择,且最后一个烽火台点燃的所有合法方案中,最小开销的数值
# dp(i) = cost(i) + min(dp(i-1), dp(i-2), ... dp(i-m)) 其实dp(i)就依赖于前面长度为m
# 滑动窗口中的最小值
dp = [0] * n

que = deque()
for idx, val in enumerate(cost):

    if idx < m:
        dp[idx] = cost[idx]
    else:
        dp[idx] = que[0][1] + cost[idx]

    while len(que) > 0 and idx - que[0][0] >= m:
        que.popleft()
    while len(que) > 0 and dp[idx] <= que[-1][1]:
        que.pop()
    que.append( (idx, dp[idx]) )

print( min(dp[-m:]) )

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值