洛谷 P1725 琪露诺(单调队列优化dp)

传送门


解题思路

很显然的一个单调队列优化dp。
但是有个细节也就是sub2的数据会卡掉,就是有的点可能根本到达不了。
例如:
输入:

5 3 4
0 1 2 3 4 5

输出:

4

而你不判断的话,会输出5。
怎么判断呢?
我们发现如果走不到某个点,则在求到这个点时,队列为空。
所以在队列是空的时候不更新dp值即可。

AC代码

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<iomanip>
#include<ctime>
#include<stack>
using namespace std;
const int maxn=2e5+5;
int n,l,r,a[maxn],dp[maxn],ans=-1e9;
deque<int> q;
int main()
{
    ios::sync_with_stdio(false);
    memset(dp,-0x3f,sizeof(dp));
    dp[0]=0;
    cin>>n>>l>>r>>a[0];
    for(int i=1;i<=n;i++) cin>>a[i];
    q.push_back(0);
    for(int i=l;i<=n;i++){
    	if(i-l>=l){
    		while(!q.empty()&&dp[q.back()]<dp[i-l]) q.pop_back();
    		q.push_back(i-l);
		}
    	if(q.front()<i-r) q.pop_front();
    	if(!q.empty()) dp[i]=a[i]+dp[q.front()];
		if(i>n-r) ans=max(ans,dp[i]);
	}
	cout<<ans;
    return 0;
}
posted @ 2021-08-21 19:01  尹昱钦  阅读(69)  评论(0编辑  收藏  举报