!-- Loading 底层遮罩 -->

P1725 琪露诺

传送门

思路

状态转移方程:dp[i] = dp[j] + val[i] (i-R<=j<=i-L) 。典型的线性动规+单调队列优化。用单调队列维护跳跃前区间内dp的最大值,降低复杂度。

代码

#include<iostream>
#include<cstring>
#define MAXN 400010
using namespace std;
int value[MAXN], dp[MAXN], L, R, N, ans = INT32_MIN, q[MAXN];
int main(void)
{
    cin >> N >> L >> R;
    for (int i = 0; i <= N; i++)
        cin >> value[i];
    memset(dp, 0xcf, sizeof(dp)); dp[0] = 0;
    int head = 0, tail = 0;
    for (int i = L; i <= N + R - 1; i++)
    {
        if (i <= N + L) {
            while (head < tail && q[head] + R < i)
                head++;
            while (head<tail && dp[i - L]>dp[q[tail - 1]])
                tail--;
            q[tail++] = i - L;
        }
        dp[i] = max(dp[i], dp[q[head]] + value[i]);
        if (i >= N)ans = max(ans, dp[i]);
    }
    cout << ans;
    return 0;
}
 

 

posted @ 2022-03-30 20:23  Thinker-X  阅读(37)  评论(0)    收藏  举报