Luo Qi Lu Snow Valley P1725 solution to a problem monotonous DP entry queue optimization problem

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;
}

Guess you like

Origin www.cnblogs.com/quanjun/p/12296914.html