做法:单调队列优化dp。

表示在放烽火台使区间合法的最小花费。
有方程
对于用单调队列维护即可。

#include <bits/stdc++.h>
using namespace std;

const int N = 200010;

int f[N], n, m, a[N];
deque<int>q;

int main() {
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
    q.push_back(0); f[0] = 0;
    for(int i = 1; i <= n; ++i) {
        while(!q.empty() && i - q.front() > m) q.pop_front();
        f[i] = f[q.front()] + a[i];
        while(!q.empty() && f[q.back()] > f[i]) q.pop_back();
        q.push_back(i); 
    }
    int ans = 0x3f3f3f3f;
    for(int i = n; i > n - m; --i) ans = min(ans, f[i]);
//    for(int i = 1; i <= n; ++i) printf("%d ", f[i]); puts("");
    printf("%d\n", ans);
}