题目:琪露诺
思路:
单调队列优化dp。
令f[i]表示走到第i个位置的最大冰冻指数,转移方程f[i]=a[i]+max{f[j]},j∈[i-r,i-l]
。
其中,max{f[j]}可用单调队列维护。
最后的答案为max{f[j]},j∈[n-r+1,n]
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 200000
int n,L,R;
int a[maxn+5];
int f[maxn+5]= {0};
int que[maxn+5]= {0};
int h=0,t=0;
void readin() {
scanf("%d%d%d",&n,&L,&R);
for(int i=0; i<=n; i++) scanf("%d",&a[i]);
}
int dp() {
for(int i=L; i<=n; i++) {
while(f[que[t]]<f[i-L]&&t>=h) t--;
que[++t]=i-L;
while(que[h]<i-R&&h<t) h++;
f[i]=a[i]+f[que[h]];
}
int s=0;
for(int i=n-R+1; i<=n; i++) s=max(s,f[i]);
return s;
}
int main() {
readin();
int ans=dp();
printf("%d",ans);
return 0;
}