首页 > 其他 > 详细

dp单调队列优化

时间:2019-08-07 09:26:47      阅读:72      评论:0      收藏:0      [点我收藏+]

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;
        }
    }

dp单调队列优化

原文:https://www.cnblogs.com/mayiyang/p/11312895.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!