题目大意:
在一个长度为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)
注释:
因为这题不算很难,所以有些细节地方就留给读者自行思考了。