股票交易 bzoj-1855 Scoi-2010

题目大意:说不明白题意系列++...题目链接

注释:略。


想法:这个题还是挺难的。

动态规划没跑了

状态:dp[i][j]表示第i天手里有j个股票的最大获利。

转移:第i天可以选择搞事情或者什么都不干。

如果不买不卖的话,有dp[i][j]=dp[i-1][j]

如果选择买入,dp[i][j]=dp[i-w-1][k]-ap[i](j-k)|k>=j-as[i]

如果选择卖出,dp[i][j]=dp[i-w-1][k]+bp[i](k-j)|k<=j+bs[i].

然后,我们以k为时间戳信息,dp[i-w-1][k]+ap[i][k]为权值信息维护单调队列(以买入为例)即可。

最后,附上丑陋的代码... ...

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 2010
using namespace std;
int t,maxp,w;
int f[N][N];
int q[N];
struct node
{
int ap,bp,as,bs;
}a[N];
int main()
{
scanf("%d%d%d",&t,&maxp,&w);
for(int i=1;i<=t;i++)
{
scanf("%d%d%d%d",&a[i].ap,&a[i].bp,&a[i].as,&a[i].bs);
}
memset(f,-0x3f,sizeof(f));
for(int i=1;i<=t;i++)
{
for(int j=0;j<=a[i].as;j++) f[i][j]=-a[i].ap*j;
for(int j=0;j<=maxp;j++) f[i][j]=max(f[i][j],f[i-1][j]);
if(i-w-1>=0)
{
int head=0,tail=0;
for(int j=0;j<=maxp;j++)
{
while(head<tail&&q[head]<j-a[i].as)head++;
while(head<tail&&f[i-w-1][j]+j*a[i].ap>=f[i-w-1][q[tail-1]]+q[tail-1]*a[i].ap)tail--;
q[tail++]=j;
if(head<tail)f[i][j]=max(f[i][j],f[i-w-1][q[head]]-(j-q[head])*a[i].ap);
}
head=0,tail=0;
for(int j=maxp;j>=0;j--)
{
while(head<tail&&q[head]>j+a[i].bs)head++;
while(head<tail&&f[i-w-1][j]+j*a[i].bp>=f[i-w-1][q[tail-1]]+q[tail-1]*a[i].bp)tail--;
q[tail++]=j;
if(head<tail)f[i][j]=max(f[i][j],f[i-w-1][q[head]]+(q[head]-j)*a[i].bp);
}
}
}
int ans=0;
for(int i=0;i<=maxp;i++)
{
ans=max(ans,f[t][i]);
}
printf("%d\n",ans);
}

小结: 单调队列好有意思...

[bzoj1855][Scoi2010]股票交易_动态规划_单调队列的更多相关文章

  1. 【BZOJ1855】股票交易(动态规划,单调队列)

    [BZOJ1855]股票交易(动态规划,单调队列) 题面 BZOJ 题解 很显然,状态之和天数以及当天剩余的股票数有关 设\(f[i][j]\)表示第\(i\)天进行了交易,剩余股票数为\(j\)的最 ...

  2. 洛谷 P2569[SCOI2010]股票交易(动规+单调队列)

    //只能写出裸的动规,为什么会有人能想到用单调队列优化Orz 题目描述 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测 ...

  3. 【BZOJ2442】修建草坪(动态规划,单调队列)

    [BZOJ2442]修建草坪(动态规划,单调队列) 题面 权限题..洛谷 题解 设\(f[i]\)表示前\(i\)个里面选出来的最大值 转移应该比较显然 枚举一个断点的位置,转移一下就好 \(f[i] ...

  4. 【CF1133E】K Balanced Teams(动态规划,单调队列)

    [CF1133E]K Balanced Teams(动态规划,单调队列) 题面 CF 让你把一堆数选一些出来分成不超过\(K\)组,每一组里面的最大值和最小值之差不超过\(5\),求最多有多少个人元素 ...

  5. 【BZOJ2806】Cheat(后缀自动机,二分答案,动态规划,单调队列)

    [BZOJ2806]Cheat(后缀自动机,二分答案,动态规划,单调队列) 题面 BZOJ 洛谷 题解 很有趣的一道题啊 对于在所有的串上面进行匹配? 很明显的后缀自动机 所以先构建出广义后缀自动机 ...

  6. BZOJ1855 [Scoi2010]股票交易 【单调队列优化dp】

    题目链接 BZOJ1855 题解 设\(f[i][j]\)表示第\(i\)天结束时拥有\(j\)张股票时的最大收益 若\(i \le W\),显然在这之前不可能有交易 \[f[i][j] = max\ ...

  7. 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 ...

  8. 2018.09.10 bzoj1855: [Scoi2010]股票交易(单调队列优化dp)

    传送门 单调队列优化dp好题. 有一个很明显的状态设置是f[i][j]表示前i天完剩下了j分股票的最优值. 显然f[i][j]可以从f[i-w-1][k]转移过来. 方程很好推啊. 对于j<kj ...

  9. bzoj1855: [Scoi2010]股票交易 单调队列优化dp ||HDU 3401

    这道题就是典型的单调队列优化dp了 很明显状态转移的方式有三种 1.前一天不买不卖: dp[i][j]=max(dp[i-1][j],dp[i][j]) 2.前i-W-1天买进一些股: dp[i][j ...

随机推荐

  1. [Swift通天遁地]三、手势与图表-(9)制作五彩缤纷的气泡图表

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  2. 题解报告:hdu 2647 Reward(拓扑排序)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 Problem Description Dandelion's uncle is a boss ...

  3. Android内存管理(8)Dalvik,ART和 .dex 是什么*

    什么是Dalvik: Dalvik是Google公司自己设计用于Android平台的Java虚拟机.Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一. Da ...

  4. 【Leetcode146】LRU Cache

    问题描述: 设计一个LRU Cache . LRU cache 有两个操作函数. 1.get(key). 返回cache 中的key对应的 val 值: 2.set(key, value). 用伪代码 ...

  5. C#中 分层 显示数据库中多表的数据信息

    如下图,要实现将三个表中的内容加载到同一个窗体中,该怎么来实现呢? 要实现上面的查询结果,我们就要从Student表中拿到学生姓名,从Subject表中拿到科目名称,从StudentResult表中拿 ...

  6. HTML和CSS网页开发基础

    一 HTML文档结构 HTML文档结构:<html>.<head>.<title>.<body>构成HTML页面中最基本的元素. HTML常用标记:1. ...

  7. 来自一个用户的体验-Alpha项目测试

    软件梦之队成员:201731062305 周蓉 这个作业属于哪个课程 <课程的链接> 这个作业要求在哪里 <作业要求的链接> 团队名称 <软件梦之队>(附上团队博客 ...

  8. 在mac上快捷找到nodejs的安装路径

    打开控制台输入 which node ,得到的输出结果就是node安装路径

  9. Json——Json与JS的区别

    JSON是JS的字面量的特殊表现形式,它使用文本表示 JS 对象信息,本质是字符串 var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包 ...

  10. Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?

    Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别? Java 中访问数据库的步骤 1)注册驱动: 2)建立连接: 3)创建Statement: 4)执 ...