uestc599最小花费【单调队列优化dp】
来源:互联网 发布:lol挂机软件2017 编辑:程序博客网 时间:2024/06/09 18:27
单调队列优化dp
单调队列是一种严格单调的队列,可以单调递增,也可以单调递减。队首位置保存的是最优解,第二个位置保存的是次优解,ect。。。
单调队列可以有两个操作:
1、插入一个新的元素,该元素从队尾开始向队首进行搜索,找到合适的位置插入之,如果该位置原本有元素,则替换它。
2、在过程中从队首删除不符合当前要求的元素。
单调队列实现起来可简单,可复杂。简单的一个数组,一个head,一个tail指针就搞定。复杂的用双向链表实现。
用处:
1、保存最优解,次优解,ect。
2、利用单调队列对dp方程进行优化,可将O(n)复杂度降至O(1)。也就是说,将原本会超时的N维dp降优化至N-1维,以求通过。这也是我想记录的重点
是不是任何DP都可以利用单调队列进行优化呢?答案是否定的。
记住!只有形如 dp[i]=max/min (f[k]) + g[i] (k<i && g[i]是与k无关的变量)才能用到单调队列进行优化。
优化的对象就是f[k]。
以上内容转载自:点击打开链接
UESTC599 最小花费
最少花费
Time Limit: 30000/10000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
Bob是一个魔法师。这天,他被
Input
第一行一个整数
每组第一行有
接下来
Output
对于每组数据,输出一个整数,表示最少花费。
Sample input and output
21 1 113 1 101 2 3
02
Source
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<cmath>#include<queue>#include<list>#include<vector>#define inf 0x3f3f3f3f using namespace std;const int maxn = 1010;int a,n,dl,q[maxn];long long f[maxn][maxn],h[maxn];// dp[i][j]=min(dp[i-1][k]+A*(j-k)+X);// dp[i][j]=min(dp[i-1][k]+A*j-A*k+x);// F[i-1][k]=dp[i-1][k]-A*k;// g[i-1][k]=A*j+X;//用单调队列优化k int main(){int t;scanf("%d", &t);while (t--){scanf("%d%d%d", &n,&dl,&a);for (int i=1;i<=n;++i){scanf("%d",&h[i]);}memset(f,0x3f,sizeof(f));for(int i=0;i<=1000;++i){f[1][i]=(i-h[1])*(i-h[1]);}for(int i=2;i<=n;++i){int front=0, rear=0; for (int j=0;j<=1000;++j){while (rear>front&&f[i-1][q[rear-1]]-a*q[rear-1]>=f[i-1][j]-a*j)rear--;q[rear++] = j;while (rear-front>1&&j>q[front]+dl)front++;f[i][j]=min(f[i][j],(j-h[i])*(j-h[i])+f[i-1][q[front]]+(j-q[front])*a);}front=rear=0;for (int j=1000;j>=0;--j){while(rear>front&&f[i-1][q[rear-1]]+q[rear-1]*a>=f[i-1][j]+j*a)rear--;q[rear++]=j;while(rear-front>1&&q[front]>j+dl)front++;f[i][j]=min(f[i][j], (j-h[i])*(j-h[i])+f[i-1][q[front]]+(q[front]-j)*a);}}long long ans=inf;for (int i=0;i<=1000;++i)ans=min(ans,f[n][i]);printf("%lld\n",ans);}return 0;}
- uestc599最小花费【单调队列优化dp】
- (单调队列优化) 最小花费 (CD1690)
- 单调队列优化DP
- 单调队列优化DP
- dp单调队列优化
- 单调队列--优化dp
- 单调队列优化dp
- 单调队列优化DP
- 单调队列优化DP
- 单调队列优化dp
- pku3709 dp单调队列优化
- POJ2373...单调队列优化DP...
- 单调队列优化dp 理解
- HDU3401 单调队列优化DP
- hdu4362 dp + 单调队列优化
- 单调队列优化的DP
- HDU4122 单调队列优化DP
- HDU2191(单调队列优化DP)
- leetcode - Valid Anagram
- android 编译OTA升级包介绍
- Java clone() 浅克隆与深度克隆
- 装饰设计模式与代理设计模式的异同
- Geohash距离估算 附近的人的距离
- uestc599最小花费【单调队列优化dp】
- 《LeetBook》LeetCode题解(1) : Two Sum[E]——哈希Map的应用
- yii2.0高级框架配置时init.bat秒退问题的解决
- FZU 2112 Tickets(欧拉路径)
- JavaScript DOM 编程之基础篇
- Storm集群搭建
- 【转】gdb程序调试工具使用简介
- 2000年清华大学计算机研究生机试真题
- C118套装分享