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

浙公网安备 33010602011771号