【[SCOI2010]股票交易】
感谢dzm,尽管接受了\(The \text{ }\text{ }king\text{ } \text{ }of\text{ } \text{ }SD\)的指点但我还是不会
至少方程还是比较好推的
状态还是很常规的,我们设\(f[i][j]\)表示在第\(i\)天持有\(j\)只股票的最大收益是多少
于是我们有三种转移
- \(f[i][j]=f[i-1][j]\)
这就相当于你这一天什么都没干,前一天持有多少股票这一天还是持有多少股票
- \(f[i][j]=max(f[i-w-1][j+k]+k*b[i])\) (\(k<=y[i]\))
这一天卖出了\(k\)只股票
- \(f[i][j]=max(f[i-w-1][j-k]-k*a[i]\) (\(k<=a[i]\))
这一天买进了\(k\)只股票
这样暴力转移的话复杂度是\(O(nm^2)\),显然是\(O(\text{TLE})\)
于是我们考虑单调队列优化
显然方程写成这个样子优化不了
我们换个写法
第一个方程我们写成这个样子
\(f[i][j]=max(f[i-w-1][k]+(k-j)*b[i])\) \(\text{ }\) \(k>=j\)且\(k<=j+y[i]\)
于是拆一下变成
\(f[i][j]=max(f[i-w-1][k]+k*b[i]-j*b[i])\)
前面两项跟\(j\)无关于是我们可以用单调队列来优化
至于第二个方程也是同理,拆开是这个样子
\(f[i][j]=max(f[i-w-1][k]+k*a[i]-j*a[i])\)
于是也可以用单调队列来优化
复杂度变为\(O(nm)\)
还有一个坑点就是如果前\(i-1\)天什么都没干
那么\(f[i][j]=0-i*a[i]*j\)
这个状态也要考虑到,否则就只有60
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#define re register
#define LL long long
#define maxn 2005
#define INF -99999999
using namespace std;
int f[maxn][maxn];
int a[maxn],b[maxn],x[maxn],y[maxn];
int dp[maxn],d[maxn];
int n,m,t;
deque<int> q1[maxn],q2[maxn];
inline int read()
{
    char c=getchar();
    int X=0;
    while(c<'0'||c>'9') c=getchar();
    while(c>='0'&&c<='9')
      X=(X<<3)+(X<<1)+c-48,c=getchar();
    return X;
}
int main()
{
    n=read();
    m=read();
    t=read();
    for(re int i=0;i<=n;i++)
        for(re int j=0;j<=m;j++)
            f[i][j]=INF;
    for(re int i=1;i<=n;i++)
    {
        a[i]=read();
        b[i]=read();
        x[i]=read();
        y[i]=read();
    }
    for(re int i=0;i<=x[1];i++)
        f[1][i]=0-a[1]*i;
    for(re int i=2;i<=n;i++)
    {
        for(re int j=0;j<=m;j++)
            dp[j]=d[j]=INF;
        int k=i-t-1;
        if(k>=0)
        {
            deque<int> q;
            for(re int j=m;j>=0;j--)
            {
                while(!q.empty()&&f[k][q.back()]+q.back()*b[i]<f[k][j]+j*b[i]) q.pop_back();
                q.push_back(j);
                while(!q.empty()&&q.front()-j>y[i]) q.pop_front();
                dp[j]=f[k][q.front()]+q.front()*b[i]-j*b[i];
            }
            q.clear();
            for(re int j=0;j<=m;j++)
            {
                while(!q.empty()&&f[k][q.back()]+q.back()*a[i]<f[k][j]+j*a[i]) q.pop_back();
                q.push_back(j);
                while(!q.empty()&&q.front()+x[i]<j) q.pop_front();
                d[j]=f[k][q.front()]+q.front()*a[i]-j*a[i];
            }
        }
        for(re int j=0;j<=m;j++)
        if(j<=x[i]) f[i][j]=max(max(f[i-1][j],max(d[j],dp[j])),-1*a[i]*j);
        else f[i][j]=max(f[i-1][j],max(d[j],dp[j]));
    }
    int ans=INF;
    for(re int i=0;i<=m;i++)
        ans=max(ans,f[n][i]);
    cout<<ans<<endl;
    return 0;
}
【[SCOI2010]股票交易】的更多相关文章
- 1855: [Scoi2010]股票交易[单调队列优化DP]
		1855: [Scoi2010]股票交易 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1083 Solved: 519[Submit][Status] ... 
- 【BZOJ1855】[Scoi2010]股票交易 DP+单调队列
		[BZOJ1855][Scoi2010]股票交易 Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预 ... 
- 洛谷P2569 [SCOI2010]股票交易
		P2569 [SCOI2010]股票交易 题目描述 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股 ... 
- BZOJ 1855: [Scoi2010]股票交易(DP+单调队列)
		1855: [Scoi2010]股票交易 Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未 ... 
- [luogu] P2569 [SCOI2010]股票交易 (单调队列优化)
		P2569 [SCOI2010]股票交易 题目描述 最近 \(\text{lxhgww}\) 又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,\(\te ... 
- 单调队列优化DP || [SCOI2010]股票交易 || BZOJ 1855 || Luogu P2569
		题面:P2569 [SCOI2010]股票交易 题解: F[i][j]表示前i天,目前手中有j股的最大收入Case 1:第i天是第一次购买股票F[i][j]=-j*AP[i]; (1<=j< ... 
- [SCOI2010]股票交易(单调队列优化dp)
		[SCOI2010]股票交易 题目描述 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第 ... 
- [bzoj1855][Scoi2010]股票交易_动态规划_单调队列
		股票交易 bzoj-1855 Scoi-2010 题目大意:说不明白题意系列++...题目链接 注释:略. 想法:这个题还是挺难的. 动态规划没跑了 状态:dp[i][j]表示第i天手里有j个股票的最 ... 
- [SCOI2010]股票交易
		题目大意: 网址:https://www.luogu.org/problemnew/show/P2569 大意:在接下来的T天中,每天股票有一个买入价格Api与卖出价格Bpi. 同时,每天买入股票数与 ... 
- P2569 [SCOI2010]股票交易 dp 单调队列优化
		LINK:股票交易 题目确实不算难 但是坑点挺多 关于初值的处理问题我就wa了两次. 所以来谢罪. 由于在手中的邮票的数量存在限制 且每次买入卖出也有限制. 必然要多开一维来存每天的邮票数量. 那么容 ... 
随机推荐
- 解决 Java 调用 Azure SDK 证书错误 javax.net.ssl.SSLHandshakeException
			Azure 作为微软的公有云平台,提供了非常丰富的 SDK 和 API 让开发人员可以非常方便的调用的各项服务,目前除了自家的 .NET.Java.Python. nodeJS.Ruby,PHP 等语 ... 
- SpringBoot 开启debug
			项目基于gradle ,今天想断点debug一下springboot,查阅资料后,纪录一下步骤. 创建Remote 创建gradle.properities 在当前项目下创建gradle.proper ... 
- Hadoop学习笔记(4) ——搭建开发环境及编写Hello World
			Hadoop学习笔记(4) ——搭建开发环境及编写Hello World 整个Hadoop是基于Java开发的,所以要开发Hadoop相应的程序就得用JAVA.在linux下开发JAVA还数eclip ... 
- java 2018面试题-多线程汇总(含解答)
			学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行总结的,因此罗列了自己整理的多线程的问题,都是自己觉得比较经典和一些大企业面试会问 ... 
- Linux From Scratch(从零开始构建Linux系统,简称LFS)(三)
			九. 系统配置 1. 安装 LFS-Bootscripts-20150222 软件包包含一套在 LFS 系统启动和关闭时的启动和停止脚本. cd /sources tar -jxf lfs-boots ... 
- Hibernate 函数 ,子查询 和原生SQL查询
			一. 函数 聚合函数:count(),avg(),sum(),min(),max() 例:(1)查询Dept表中的所有的记录条数. String hql=" select count(*) ... 
- JS之捕获冒泡和事件委托
			一.事件流(捕获,冒泡) 事件流:指从页面中接收事件的顺序,有冒泡流和捕获流. 当页面中发生某种事件(比如鼠标点击,鼠标滑过等)时,毫无疑问子元素和父元素都会接收到该事件,可具体顺序是怎样的呢?冒 ... 
- linux系统下php扩展的安装
			0. 这里以php安装redis扩展为例 1. 首先下载并解压redis扩展包 [root@xxx ~]# cd /usr/local/src [root@xxx src]# wget https:/ ... 
- 【Android】11.0 UI开发(二)——列表控件ListView的简单实现1
			************************ 转载请注明出处:https://www.cnblogs.com/xiaofu007/p/10342462.html ***************** ... 
- java压缩与解压
			一 概述 1.目录进入点 目录进入点是文件在压缩文件中的映射,代表压缩文件.压缩文件时,创建目录进入点,将文件写入该目录进入点.解压时,获取目录进入点,将该目录进入点的内容写入硬盘指定文件. 如果目录 ... 
