【洛谷P1725】琪露诺(单调队列dp)
dp方程很简单啊,dp[i]=max{dp[i-r],dp[i-r+1]...dp[i-l]}+val[i];
暴力找最大值只有60分,考虑优化,很明显,用单调队列维护一个滑动窗口即可。
起点至少是l,答案的来源最多是n-l。
话说单调队列写起来好恶心啊。。。每次都写不对。。。还是要多练看来
#include<bits/stdc++.h>
#define N 200005
using namespace std;
int n,l,r,val[N],dp[N];
deque <int> q;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL),cout.tie(NULL);
cin>>n>>l>>r;
for(int i=0;i<=n;i++) cin>>val[i];
for(int i=l;i<=n;i++)
{
while(!q.empty()&&dp[q.back()]<dp[i-l]) q.pop_back();
q.push_back(i-l);
while(!q.empty()&&q.front()+r<i) q.pop_front();
dp[i]=max(dp[i],dp[q.front()]+val[i]);
}
int ans=0;
for(int i=n-r+1;i<=n;i++) ans=max(ans,dp[i]);
cout<<ans;
return 0;
}
QQ40523591~欢迎一起学习交流~