高中OJ1771. 【NOIP动态规划专题】烽火传递

本文解析了一道关于在序列中选取数值的DP问题,并提出了使用小根堆优化算法的方法,以实现高效的求解。

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

题目大意:

在一个长度为N的序列当中选出任意个数,使得其中任意连续M个数中至少有一个数被选,求选出数之和的最小值。


题目分析:

显而易见的DP。

设F[i]表示序列中从1~i位置满足条件且第i个位置必选的最小值

(初始化自己想)

先假设M=3  0表示未选 1表示选

0 1 0 0 1 0 0

的情况也是可以的。

所以可以得出方程:

F[i]=F[i-j]+a[i]

得分:80分


帅气的满分做法:

因为二重循环的时间复杂度是O(nm)所以会爆

SO我们维护一个小根堆(好吧我承认我不知道单调队列),把F数组的元素放进去,每次拿走堆顶元素直到该元素符合要求。

为了满足所有位置,最后答案是min(F[i]) (i=n-m+1~n)


注释:

因为这题不算很难,所以有些细节地方就留给读者自行思考了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值