洛谷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;
}
posted @ 2020-02-11 21:37  quanjun  阅读(119)  评论(0编辑  收藏  举报