zoukankan      html  css  js  c++  java
  • 洛谷 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;
    }
    
  • 相关阅读:
    分解质因数
    大素数测试和分解质因数
    快速幂
    欧拉函数
    素数
    gcd,lcm,ext_gcd,inv
    凸包问题 poj 2187
    map的 简单用法
    判断线段是否在园内
    2-sat 问题
  • 原文地址:https://www.cnblogs.com/yinyuqin/p/15170346.html
Copyright © 2011-2022 走看看