UESTC 880 生日礼物 --单调队列优化DP
定义dp[i][j]表示第i天手中有j股股票时,获得的最多钱数。
转移方程有:
1.当天不买也不卖: dp[i][j]=dp[i-1][j];
2.当天买了j-k股: dp[i][j]=max(dp[r][k]+(j-k)*Ap[i]); (r<i-w)
3.当天卖了k-j股: dp[i][j]=max(dp[r][k]+(k-j)*Bp[i]); (r<i-w)
直接转移复杂度太高,为O(n^2*Maxp^2).
分别考虑每种转移,第一种不用管,考虑第二种。
dp[i][j]=max(dp[r][k]+(j-k)*Ap[i])
变换得:dp[i][j]-j*Ap[i]=dp[r][k]-k*Ap[i]。
所以变成使dp[r][k]-k*Ap[i]最大。
对于dp[r][k]-k*Ap[i], 因为我们已经有dp[i][k]=dp[i-1][k]的转移了,说明,dp[i][k]包含了所有dp[j][k] (j<i)的情况。 换句话说dp[i][k]是递增的。那么这里我们显然就可以直接把r换成i-w-1,于是变成了求 dp[i-w-1][k]-k*Ap[i]的最大值。
令f[k]=dp[i-w-1][k]-k*Ap[i]) 原式变为 dp[i][j]=max(f[k])+j*Ap[i] (0=<k<j),如果再把与i相关的东西变成常数,则变成类似dp[j] = max(f[k])+c[j]形式,即变成可用单调队列优化的形式。
维护一个单调递增队列来求f[k]。复杂度O(n*Maxp).
因为直接令r=i-w-1,因为r>=1,所以i>w+1时才能转移,这是i<=w+1的情况需要预处理。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define Mod 1000000007
using namespace std;
#define N 2007 struct node
{
int num,val;
}que[N]; int AP[N],BP[N],AS[N],BS[N];
int dp[N][N];
int n,Maxp,w; void init()
{
int i,j;
for(i=;i<=;i++)
for(j=;j<=Maxp;j++)
dp[i][j] = -Mod;
dp[][] = ;
for(i=;i<=w+;i++)
for(j=;j<=min(AS[i],Maxp);j++)
dp[i][j] = -j*AP[i];
} int main()
{
int i,j,k;
int t,head,tail;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&Maxp,&w);
for(i=;i<=n;i++)
scanf("%d%d%d%d",&AP[i],&BP[i],&AS[i],&BS[i]);
init();
for(i=;i<=n;i++)
{
//unbuy & unsell
for(j=;j<=Maxp;j++)
dp[i][j] = max(dp[i][j],dp[i-][j]);
if(i-w- <= )
continue;
//buy j-k stocks
head = ;
tail = ;
for(j=;j<=Maxp;j++)
{
int tmp = dp[i-w-][j] + j*AP[i];
while(tail >= head && j-que[head].num > AS[i])
head++;
if(head <= tail)
dp[i][j] = max(dp[i][j],que[head].val-(j-que[head].num)*AP[i]);
while(tail >= head && que[tail].val+que[tail].num*AP[i] < tmp)
tail--;
que[++tail].num = j;
que[tail].val = dp[i-w-][j];
}
//sell k-j stocks
head = ;
tail = ;
for(j=Maxp;j>=;j--)
{
int tmp = dp[i-w-][j] + j*BP[i];
while(tail >= head && que[head].num-j > BS[i])
head++;
if(head <= tail)
dp[i][j] = max(dp[i][j],que[head].val-(j-que[head].num)*BP[i]);
while(tail >= head && que[tail].val+que[tail].num*BP[i] < tmp)
tail--;
que[++tail].num = j;
que[tail].val = dp[i-w-][j];
}
}
int res = ;
for(i=;i<=Maxp;i++)
res = max(res,dp[n][i]);
printf("%d\n",res);
}
return ;
}
UESTC 880 生日礼物 --单调队列优化DP的更多相关文章
- 【单调队列优化dp】uestc 594 我要长高
http://acm.uestc.edu.cn/#/problem/show/594 [AC] #include<bits/stdc++.h> using namespace std; t ...
- 单调队列优化DP,多重背包
单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...
- bzoj1855: [Scoi2010]股票交易--单调队列优化DP
单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...
- hdu3401:单调队列优化dp
第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...
- Parade(单调队列优化dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others) ...
- BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP
BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP Description 有一排n棵树,第i棵树的高度是Di. MHY要从第一棵树到第n棵树去找他的妹子玩. 如果MHY在 ...
- 【单调队列优化dp】 分组
[单调队列优化dp] 分组 >>>>题目 [题目] 给定一行n个非负整数,现在你可以选择其中若干个数,但不能有连续k个数被选择.你的任务是使得选出的数字的和最大 [输入格式] ...
- [小明打联盟][斜率/单调队列 优化dp][背包]
链接:https://ac.nowcoder.com/acm/problem/14553来源:牛客网 题目描述 小明很喜欢打游戏,现在已知一个新英雄即将推出,他同样拥有四个技能,其中三个小技能的释放时 ...
- 单调队列以及单调队列优化DP
单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...
随机推荐
- php中设定一个全局异常处理。全局catch。默认catch。默认异常处理
<?php function handleMissedException($e) { echo "Sorry, something is wrong. Please try again ...
- sqlite3之基本操作(一)
简单的介绍 SQLite数据库是一款非常小巧的嵌入式开源数据库软件,也就是说没有独立的维护进程,所有的维护都来自于程序本身.它是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经 ...
- LCA算法倍增算法(洛谷3379模板题)
倍增(爬树)算法,刚刚学习的算法.对每一个点的父节点,就记录他的2k的父亲. 题目为http://www.luogu.org/problem/show?pid=3379 第一步先记录每一个节点的深度用 ...
- mysql命令行备份数据库
MySQL数据库使用命令行备份|MySQL数据库备份命令 例如: 数据库地址:127.0.0.1 数据库用户名:root 数据库密码:pass 数据库名称:myweb 备份数据库到D盘跟目录 mysq ...
- 误报的java.sql.SQLException: Parameter number 21 is not an OUT parameter
今天为了模拟一个mysql内存不释放问题,要测试一个存储过程,同时具有出参和入参,启动时报了上述错误. <select id="funcl_trd_secu_execution_que ...
- jQuery实现图片伦播效果(淡入淡出+左右切换)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- DOM性能小记
在使用DOM操作时,同样的效果用不同的方式来实现,性能方面也会有很大的差异.尤其在移动式设备上,资源本来就很有限,一旦DOM写不好的话操作就会非常卡顿.这个周末,就写个DOM性能小记吧.错漏之处,望多 ...
- Backbone学习笔记一Backbone中的MVC
原文章地址http://bigdots.github.io/2015/12/01/Backbone学习笔记(一)/#more Backbone.js为复杂WEB应用程序提供模型(models).集合( ...
- SharePoint 中关于event receivers的讨论
今天一早,跟几个小伙伴在群里讨论了有关事件触发器的东西,感觉收获颇多,拿出来和大家分享.讨论的内容,主要就是关于事件触发器的同步/异步的设置以及作用. 其实接触SharePoint颇久,对于事件触发器 ...
- Level 4 A10: 飞张?
看来庄家的红桃2个输张没法解决,只能寄希望于飞K了. 但如果将牌2-2分布,还有更稳的打法.在下面这种东家3张黑桃的情况时,庄家只需垫到红桃2就行了. 如果东家有4张黑桃,那就只有飞红桃K这一条路了.