首页 / 算法 / 算法笔记--单调队列优化dp
算法笔记--单调队列优化dp
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了算法笔记--单调队列优化dp,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1845字,纯文字阅读大概需要3分钟。
内容图文
单调队列:队列中元素单调递增或递减,可以用双端队列实现(deque),队列的前面和后面都可以入队出队。
单调队列优化dp:
问题引入:
dp[i] = min( a[j] ) ,i-m < j <= i
普通的做法是O(nlogn),但是当n很大是,这个复杂度就不行了,考虑用单调队列优化来达到O(n)。
单调队列优化dp时维护的一般都是两个值{ id(下表),value(值)},且它们都保持单调。
对于这个问题,我们维护一个两个值都单调递增的序列。
查询:队首不断删除,直到队首下标大于等于i - m + 1,队首就是答案。
插入:因为要保证下标单调递增,所以从队尾加入元素a[i],因为又要保证值单调递增,所以我们不断删除队尾大于a[i]的元素,直到队尾小于a[i]或者队列为空,然后在队尾添加a[i]。
为什么我们能直接删除队尾大于a[i]的元素呢?
因为队尾删除的那些元素下标比a[i]小且值比a[i]大,如果这些元素可以是答案,那么a[i]肯定比他们好,所以这些值不会对答案产生贡献,所以直接删除就好了。
最后,每个元素最多入队一次,出队一次,复杂度为O(n)。
例题:POJ 2823
代码:
#include<iostream> #include<cstdio> #include<queue> #include<deque> usingnamespace std; #define fi first #define se second #define pi acos(-1.0) #define LL long long #define mp make_pair #define pb push_back #define ls rt<<1, l, m #define rs rt<<1|1, m+1, r #define ULL unsigned LL #define pll pair<LL, LL> #define pii pair<int, int> #define mem(a, b) memset(a, b, sizeof(a)) #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); #define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout); //headconstint N = 1e6 + 5; int ans1[N], ans2[N]; int main() { int n, k, x; scanf("%d %d", &n, &k); deque<pii>mn, mx; for (int i = 1; i <= n; i++) { scanf("%d", &x); while(!mn.empty() && mn.back().se >= x) mn.pop_back(); mn.pb(mp(i, x)); while(!mn.empty() && mn.front().fi < i-k+1) mn.pop_front(); ans1[i] = mn.front().se; while(!mx.empty() && mx.back().se <= x) mx.pop_back(); mx.pb(mp(i, x)); while(!mx.empty() && mx.front().fi < i-k+1) mx.pop_front(); ans2[i] = mx.front().se; } for (int i = k; i <= n; i++) printf("%d%c", ans1[i], " \n"[i==n]); for (int i = k; i <= n; i++) printf("%d%c", ans2[i], " \n"[i==n]); return0; }
原文:https://www.cnblogs.com/widsom/p/9298088.html
内容总结
以上是互联网集市为您收集整理的算法笔记--单调队列优化dp全部内容,希望文章能够帮你解决算法笔记--单调队列优化dp所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。