您的位置:首页 > 其它

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

2016-11-09 19:02 483 查看
题目大意:

在一个长度为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)

注释:

因为这题不算很难,所以有些细节地方就留给读者自行思考了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: