【洛谷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;
}
posted @ 2018-08-16 00:24  Patrickpwq  阅读(114)  评论(0编辑  收藏  举报