Topic links: https://www.luogu.com.cn/problem/P1725
Problem-solving ideas:
This question is monotonous entry queue optimization problem DP.
State transition equation is:
\[f[i] = \min_{j \in [i-r,i-l]} f[j] + a[i]\]
Queue may be used to optimize monotonous.
Codes are as follows:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 200020;
int n, l, r, a[maxn], f[maxn], ans;
deque<int> que;
int main() {
cin >> n >> l >> r;
for (int i = 0; i <= n; i ++) cin >> a[i];
memset(f+1, -1, sizeof(int)*n);
int j = 0;
for (int i = 1; i <= n; i ++) {
for (; j <= i-l; j ++) {
if (f[j] == -1) continue;
while (!que.empty() && f[que.back()] <= f[j]) que.pop_back();
que.push_back(j);
if (que.front() < i-r) que.pop_front();
}
if (!que.empty()) f[i] = f[que.front()] + a[i];
}
for (int i = max(n+1-r, 0); i <= n; i ++) {
if (f[i] != -1)
ans = max(ans, f[i]);
}
cout << ans << endl;
return 0;
}