题链:

http://www.lydsy.com/JudgeOnline/problem.php?id=1855

题解:

DP,单调队列优化。
(好久没做 DP题,居然还意外地想出来了)

定义 dp[i][k] 表示前 i天,手上还有 k股的最大收益。
(注意这个定义是个前缀的形式)
假设枚举到了第 i天,令 j=i-W-1。
那么dp[i][]就由dp[j][]转移而来。(说了是前缀形式的啦,就不要去枚举 j-1,j-2...了)
转移还是比较显然的:
枚举第 i 天结束手上还剩的股数 k:
      枚举今日购买 d张:cmax(dp[i][k],dp[j][k-d]-d*AP);
      枚举今日卖出 d张:cmax(dp[i][k],dp[j][k+d]+d*BP);
      然后再来一个前缀的转移:cmax(dp[i][k],dp[i-1][k]);
这个复杂度是 T*MAXP*MAXP的,只能过 50分。

考虑优化(以购买转移为例),
显然转移的区间为连续的一段,
即若对于 dp[i][k]来说,转移来源是 dp[j][k-1]~dp[j][k-AS]。
且不难发现,如果 k-1>=x>y>=k-AS,且 dp[j][x] > dp[j][y]-val  (val=(x-y)*AP),
那么如论如何dp[j][y]都不可能贡献答案。

所以就用单调队列维护每次转移的最值就好啦。
一个小技巧:在从 计算 dp[i][k] 到 计算 dp[i][k+1] 时,
显然单调队列里的旧元素的贡献相比刚刚加进队列的 newval=dp[j][k]来说都会减一个 AP,
但不好整体修改,(难道你想用数据结构维护?)
所以就令新加进队列的值 newval=dp[j][k]+k*AP
保持好队列里的元素的相对大小关系就好了(即dp[j][k-1]始终比dp[j][k]多减了一个AP)。
(卖出的转移就类似了。)
最终复杂度可以做到 T*MAXP

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 2005
#define ll long long
#define filein(x) freopen(#x".in","r",stdin);
#define fileout(x) freopen(#x".out","w",stdout);
using namespace std;
ll dp[MAXN][MAXN],qv[MAXN],ANS,newval;
int T,MAXP,W,AP,BP,AS,BS,qk[MAXN];
void cmax(ll &a,ll b){
if(a<b) a=b;
}
int main()
{
filein(trade); fileout(trade);
memset(dp,0xcc,sizeof(dp)); dp[0][0]=0;
scanf("%d%d%d",&T,&MAXP,&W);
for(int i=1,j,l,r;i<=T;i++){ //2000
scanf("%d%d%d%d",&AP,&BP,&AS,&BS);
j=max(i-W-1,0);
for(int k=0;k<=MAXP;k++)//50->2000 //前缀形式,今日不做任何操作
cmax(dp[i][k],dp[i-1][k]);
l=1;r=1; qk[l]=0; qv[l]=dp[j][0];
for(int k=1;k<=MAXP;k++){//50->2000
//购置
//for(int d=1;d<=AS&&k-d>=0;d++) cmax(dp[i][k],dp[j][k-d]-1ll*d*AP);
while(l<=r&&k-qk[l]>AS) l++;
cmax(dp[i][k],dp[j][qk[l]]-1ll*(k-qk[l])*AP);
newval=dp[j][k]+1ll*k*AP;
while(l<=r&&qv[r]<=newval) r--;
r++; qk[r]=k; qv[r]=newval;
}
l=1;r=1; qk[l]=MAXP; qv[l]=dp[j][MAXP];
for(int k=MAXP-1;k>=0;k--){//50->2000
//出售
//for(int d=1;d<=BS&&k+d<=MAXP;d++) cmax(dp[i][k],dp[j][k+d]+1ll*d*BP);
while(l<=r&&qk[l]-k>BS) l++;
cmax(dp[i][k],dp[j][qk[l]]+1ll*(qk[l]-k)*BP);
newval=dp[j][k]-1ll*(MAXP-k)*BP;
while(l<=r&&qv[r]<=newval) r--;
r++; qk[r]=k; qv[r]=newval;
}
}
//for(int k=0;k<=MAXP;k++) cmax(ANS,dp[T][k]);
cout<<dp[T][0];
return 0;
}

●BZOJ 1855 [Scoi2010]股票交易的更多相关文章

  1. bzoj 1855: [Scoi2010]股票交易

    Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价 ...

  2. BZOJ 1855 [Scoi2010]股票交易 ——动态规划

    DP方程是比较简单的,主要有三种:什么都不做.买入.卖出. 发现买入卖出都是$\Theta (n^3)$但是转移方程都是线性的,而且决策和当前的情况是分开的. 所以可以单调队列优化. 复杂度$\The ...

  3. 1855: [Scoi2010]股票交易[单调队列优化DP]

    1855: [Scoi2010]股票交易 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1083  Solved: 519[Submit][Status] ...

  4. BZOJ 1855: [Scoi2010]股票交易(DP+单调队列)

    1855: [Scoi2010]股票交易 Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未 ...

  5. 单调队列优化DP || [SCOI2010]股票交易 || BZOJ 1855 || Luogu P2569

    题面:P2569 [SCOI2010]股票交易 题解: F[i][j]表示前i天,目前手中有j股的最大收入Case 1:第i天是第一次购买股票F[i][j]=-j*AP[i]; (1<=j< ...

  6. [BZOJ 1855] 股票交易

    Link: BZOJ 1855 传送门 Solution: 比较明显的$dp$模型 令$dp[i][j]$为第$i$天持有$j$支股票时的最大利润 对其购买股票和售出股票分别$dp$,这里以购买为例: ...

  7. 【BZOJ1855】[Scoi2010]股票交易 DP+单调队列

    [BZOJ1855][Scoi2010]股票交易 Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预 ...

  8. 洛谷P2569 [SCOI2010]股票交易

    P2569 [SCOI2010]股票交易 题目描述 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股 ...

  9. [luogu] P2569 [SCOI2010]股票交易 (单调队列优化)

    P2569 [SCOI2010]股票交易 题目描述 最近 \(\text{lxhgww}\) 又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,\(\te ...

随机推荐

  1. Linux kernel 的 sendfile 是如何提高性能的

    Linux kernel 的 sendfile 是如何提高性能的 现在流行的 web 服务器里面都提供 sendfile 选项用来提高服务器性能,那到底 sendfile 是什么,怎么影响性能的呢? ...

  2. nyoj Mod

    Ocean用巧妙的方法得到了一个序列,该序列有N个元素,我们用数组a来记录(下标从0到N−1). Ocean定义f[i]=(((i%a[0])%a[1])%-)%a[N−1]. 现在Ocean会给出Q ...

  3. R语言基础2

    ----------------------------------R语言学习与科研应用,科研作图,数据统计挖掘分析,群:719954246-------------------------- 通常, ...

  4. 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  5. SpringCloud应用入库后乱码问题

    一.现象 1.请求 2.入库后 二.解决过程 1.配置application.properties 2.代码配置 3.数据库(关键!!) 3.请求 三.验证过程 1.win10 - 本地验证通过 2. ...

  6. Spring知识点回顾(08)spring aware

    Spring知识点回顾(08)spring aware BeanNameAware 获得容器中的bean名称 BeanFactoryAware 获得当前的bean factory Applicatio ...

  7. Spring Security 入门(1-3-2)Spring Security - http元素 - intercept-url配置

    http元素下可以配置登录页面,也可以配置 url 拦截. 1.直接配置拦截url和对应的访问权限 <security:http use-expressions="false" ...

  8. DevExpress控件的一些快捷操作

    用的DevExpress控件时,有一些操作并不太方便,根据我自己需要的封装了一些控件的事件,调用的时候直接绑定控件的事件就可以了 例如: this.ComboBoxEdit.KeyDown += Ct ...

  9. express学习(三)—— cookie和session

    express学习(三)-- cookie和session cookie存在浏览器中,最大只能保存4K数据,不安全 session存在服务器中,不能独立(先读取cookie再读取session),较安 ...

  10. power designer 连接mysql提示“connection test failed”

    本机环境: win10 64位 jdk8 64位 问题: 测试连接时,总是提示 根据网上搜索: 根源在于:PowerDesigner based on 32 bit JVM kernel 参考: ht ...