洛谷 P1725 琪露诺

题目:琪露诺

思路:
单调队列优化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;
}

猜你喜欢

转载自blog.csdn.net/rabbit_ZAR/article/details/81713039