dp单调队列优化

dp单调队列优化

\(dp[i]=\max/\min(dp[j])+c[i]\)

for example: \(dp[i]=\min(dp[j])+c[i]\)考虑两个决策\(p,q(p<q)\),若\(dp[p]>=dp[q]\),则决策永远不可能为\(p\)。这是因为\(dp[p]\)的值没有\(dp[q]\),同时比\(q\)离开决策范围更快。总之,\(q\)生存能力更强

简单来讲,维护单调递增的一组决策


template <typename T>
struct dequeue
{
    vector <T> q;
    ll l,r;
    void init(int n)
    {
        q.resize(n);
        l=0,r=0;
    }
    bool empty()
    {
        return l>=r;
    }
    T back()
    {
        return q[r];
    }
    T front()
    {
        return q[l];
    }
    void pop_front()
    {
        l++;
    }
    void pop_back()
    {
        r--;
    }
    void push_back(T k)
    {
        q[++r]=k;
    }
    void insert(T k)
    {
        while (l<=r&&back().first<=k.first) pop_back();
        push_back(k);
    }
};

定义:

dequeue<pair<ll,int> > q;
q.init(101001);

for (ll i=1;i<=n;i++)
    {
        q.insert(make_pair(a[i],i));
        while (q.front().second<i-k+1) q.pop_front();
        if (i-k+1>0)
        {
            ans+=q.front().first;
        }
    }

猜你喜欢

转载自www.cnblogs.com/mayiyang/p/11312895.html
今日推荐