HDU 3401 Trade(斜率优化dp)
http://acm.hdu.edu.cn/showproblem.php?pid=3401
题意:
有一个股市,现在有T天让你炒股,在第i天,买进股票的价格为APi,卖出股票的价格为BPi,同时最多买进股票的数量为ASi,卖出股票的数量为BSi。一次交易之后要隔W天之后才能再次交易,并且手上最多持股maxP,问最多可以炒到多少钱。
思路:
首先列一个DP方程:

分别代表不买不卖,买进股票,卖出股票三种情况(上面 (j-k)<=AS[i] , (k-j)<=BS[i])。
那么这里需要枚举r和k的情况,由于相邻两次交易必须隔W天,也就是如果第i天交易了,那么至少要到第i+w+1天才能再次交易。如果我们在第i天要交易股票,那么前w天都是不买不卖的情况,那么前w天的情况都是一样的,所以这以r直接为i-w-1即可。

最后是将上面的式子化简一下:

可以看见右边是与k有关的表达式,左边是与j有关的表达式,右边我们只需要选择最大的值即可,那么这就可以用单调队列来优化了。
以买股票为例子说明:
因为是买股票,所以j肯定是大于k的,所以j从小到大枚举。每次计算出右边的值,单调队列保存递减值。每次取队首的最大值,当然队首元素必须满足AS[i]的条件,不满足就出队列。
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn = +; int t, maxp, w, ap[maxn], bp[maxn], as[maxn], bs[maxn], head, tail;
int dp[maxn][maxn];
struct node
{
int p;
int x;
}q[maxn]; int main()
{
//freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&t,&maxp,&w);
for(int i=;i<=t;i++)
scanf("%d%d%d%d",&ap[i],&bp[i],&as[i],&bs[i]); for(int i=;i<=t;i++)
for(int j=;j<=maxp;j++)
dp[i][j] = -0x3f3f3f3f; for(int i=;i<=w+;i++)
for(int j=;j<=as[i];j++)
dp[i][j] = -j*ap[i]; for(int i=;i<=t;i++)
{
for(int j=;j<=maxp;j++)
dp[i][j] = max(dp[i][j],dp[i-][j]);
if(i<=w+) continue;
//买进
head = tail = ;
for(int j=;j<=maxp;j++)
{
int x = dp[i-w-][j]+j*ap[i];
while(head<tail && q[tail-].x<x) tail--;
q[tail].x = x;
q[tail++].p = j;
while(head<tail && j-q[head].p>as[i]) head++;
dp[i][j] = max(dp[i][j], q[head].x-j*ap[i]);
} //卖出
head = tail = ;
for(int j=maxp;j>=;j--)
{
int x = dp[i-w-][j]+j*bp[i];
while(head<tail && q[tail-].x<x) tail--;
q[tail].x = x;
q[tail++].p = j;
while(head<tail && j+bs[i]<q[head].p) head++;
dp[i][j] = max(dp[i][j], q[head].x-j*bp[i]);
}
}
int ans = ;
for(int i=;i<=maxp;i++)
ans = max(ans,dp[t][i]);
printf("%d\n",ans);
}
return ;
}
HDU 3401 Trade(斜率优化dp)的更多相关文章
- hdu 2829 Lawrence(斜率优化DP)
题目链接:hdu 2829 Lawrence 题意: 在一条直线型的铁路上,每个站点有各自的权重num[i],每一段铁路(边)的权重(题目上说是战略价值什么的好像)是能经过这条边的所有站点的乘积之和. ...
- HDU 2829 Lawrence (斜率优化DP或四边形不等式优化DP)
题意:给定 n 个数,要你将其分成m + 1组,要求每组数必须是连续的而且要求得到的价值最小.一组数的价值定义为该组内任意两个数乘积之和,如果某组中仅有一个数,那么该组数的价值为0. 析:DP状态方程 ...
- hdu 3401 单调队列优化DP
Trade Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
- hdu 3480 Division(斜率优化DP)
题目链接:hdu 3480 Division 题意: 给你一个有n个数的集合S,现在让你选出m个子集合,使这m个子集合并起来为S,并且每个集合的(max-min)2 之和要最小. 题解: 运用贪心的思 ...
- hdu 3401 单调队列优化+dp
http://acm.hdu.edu.cn/showproblem.php?pid=3401 Trade Time Limit: 2000/1000 MS (Java/Others) Memor ...
- HDU 6619 Horse 斜率优化dp
http://acm.hdu.edu.cn/showproblem.php?pid=6619 #include<bits/stdc++.h> #define fi first #defin ...
- Print Article hdu 3507 一道斜率优化DP 表示是基础题,但对我来说很难
Print Article Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)To ...
- HDU 2993 MAX Average Problem(斜率优化DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993 题目大意:给定一个长度为n(最长为10^5)的正整数序列,求出连续的最短为k的子序列平均值的最大 ...
- HDU 3507 Print Article(斜率优化DP)
题目链接 题意 : 一篇文章有n个单词,如果每行打印k个单词,那这行的花费是,问你怎么安排能够得到最小花费,输出最小花费. 思路 : 一开始想的简单了以为是背包,后来才知道是斜率优化DP,然后看了网上 ...
- HDU 3045 Picnic Cows(斜率优化DP)
Picnic Cows Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
随机推荐
- docker Dockerfile指令ADD和COPY的区别,添加目录方法
docker Dockerfile指令ADD和COPY的区别,添加目录方法 ADD指令的功能是将主机构建环境(上下文)目录中的文件和目录.以及一个URL标记的文件 拷贝到镜像中.其格式是: ADD 源 ...
- js中的children实时获取子元素
先看下面一个小例子的结果 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- docker exec进程是由谁产生的
1.问题: 通过docker exec产生的进程bash(5704)看ppid是docker-containe(5564),但是通过ptrace进程号5564没有关于clone的系统调用,就算ptra ...
- dubbo原理
1,观察DubboBeanDefinitionParser 的构造方法,给它打一个断点,发现其前一步在DubboNamespaceHandler 应用启动会连续调此方法 DubboBeanDefini ...
- Struts2 概述
1. struts2应用在javaee三层结构中web层框架 2. struts2框架在struts1和webwork基础之上的发展全新的框架 3.struts2 解决的问题: 用户管理的crud操作 ...
- Tsung压力测试工具安装使用
工具安装 1)unixODBC ./configure; make; make install 或者yum安装 2)ncurses-devel ./configure; make; make inst ...
- Mysql 利用拷贝data目录文件的方式迁移mysql数据库
Mysql 利用拷贝data目录文件的方式迁移mysql数据库 步骤如下: 1.首先要确定data目录 这个问题困扰了我很久,因为网上的帖子大部分只是说拷贝mysql数据库目录下的data文件夹中的数 ...
- C# ms speech文字转语音例子
最近突发奇想 想玩玩 文字转语音的东东 谷歌了一下 发现微软有一个TTS 的SDK 查了查相关资料 发现 还真不错 然后就开始玩玩Microsoft Speech SDK的 DEMO了 ...
- 把源码放到服务器部署webservice调用出错 MVC C#
C# WebService在本地调用正常,同样的代码布睹到服务器上总是调用报如下错误 Server Error in '/' Application. The resource cannot be f ...
- vim插件的安装方式 -- vim注释插件和doxygen函数注释生成插件-ctrlp插件-tabular等号对齐 插件
使用unzip的时候 指定 -d选项, 是说明解压到的 目标地址. 这个参数还是比较方便的, 比直接unzip到当前目录, 然后在去拷贝到目标目录, 然后再删除当前目录中的解压文件夹, 方便多了. 使 ...