P1725 琪露諾
阿新 • • 發佈:2020-08-02
線性dp+單調佇列優化
單獨的線性dp很好想,也很好卡。需要用單調佇列優化。
對於1~l-1的點,他們是不可能到達的,(當然還有,不過因此for從l開始)。初始化dp為一個大負數,因為有negative答案
然後從l~n列舉(這裡是要算dp的點),畫個圖就很好理解,單調佇列掃到的點和列舉的點不一樣。
佇列裡存的是dp,不是原值,這個很好理解。
慘痛教訓:
過於依賴stl的我手寫佇列第一次掛了(邊界暈了)
#include<iostream> #include<queue> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int q[200001]; long long dp[2000001]; long long v[2000001]; int n,l,r; int h,t; int p; long long ans; int main(){ scanf("%d%d%d",&n,&l,&r); for(int i=0;i<=n;++i){ scanf("%lld",&v[i]); } memset(dp,-0x3f,sizeof(dp)); dp[0]=0; for(int i=l;i<=n;++i){ while(h<=t&&q[t]<=dp[p]) t--; t++; q[t]=dp[p]; while(t-h+1>r-l+1) h++; dp[i]=q[h]+v[i]; p++; } ans=-0x7f7f7f; for(int i=n-r+1;i<=n;++i){ ans=max(ans,dp[i]); } cout<<ans; return 0; }