洛谷P1725 琪露诺 题解 单调队列优化DP入门题
题目链接:https://www.luogu.com.cn/problem/P1725
解题思路:
这道题目是单调队列优化DP的入门题。
状态转移方程是:
\[f[i] = \min_{j \in [i-r,i-l]} f[j] + a[i]
\]
可以使用单调队列优化。
实现代码如下:
#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;
}