感谢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]股票交易】的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. [SCOI2010]股票交易(单调队列优化dp)

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

  8. [bzoj1855][Scoi2010]股票交易_动态规划_单调队列

    股票交易 bzoj-1855 Scoi-2010 题目大意:说不明白题意系列++...题目链接 注释:略. 想法:这个题还是挺难的. 动态规划没跑了 状态:dp[i][j]表示第i天手里有j个股票的最 ...

  9. [SCOI2010]股票交易

    题目大意: 网址:https://www.luogu.org/problemnew/show/P2569 大意:在接下来的T天中,每天股票有一个买入价格Api与卖出价格Bpi. 同时,每天买入股票数与 ...

  10. P2569 [SCOI2010]股票交易 dp 单调队列优化

    LINK:股票交易 题目确实不算难 但是坑点挺多 关于初值的处理问题我就wa了两次. 所以来谢罪. 由于在手中的邮票的数量存在限制 且每次买入卖出也有限制. 必然要多开一维来存每天的邮票数量. 那么容 ...

随机推荐

  1. java并发编程(3)避免活跃性危险

    活跃性危险 一.死锁 发生:每个人都不愿意放弃自己的锁,确想要别人的锁,这就会导致死锁  1.锁顺序死锁:如果每个线程以固定的顺序获取锁,那么至少在程序中不会出现锁顺序导致的死锁: 因为顺序固定如:所 ...

  2. [转]微信小程序开发踩坑记录

    本文转自:http://www.cnblogs.com/NKnife/p/6283605.html 1.由于小程序wx.request()方法是异步的,在app.js执行ajax后,各分页加载app. ...

  3. The Internet Communications Engine (Ice) 跨平台异构通讯方案 第二弹-Hello world!

    如果不知道ICE是什么的同学,请看上一篇的ICE简介:http://www.cnblogs.com/winds/p/3864677.html 好了,HelloWorld,从中间语言讲起. 首先,我们新 ...

  4. Oracle和SQL server查询数据库中表的创建和最后修改时间

    有时候我们需要查看下数据数据库中表的创建时间和最后修改时间,可以通过以下语句实现: Oracle数据库 -- 查看当前用户下的表 SELECT * FROM USER_TABLES -- 查看数据库中 ...

  5. Navicat 连接MySQL 8.0.11 出现2059错误

    错误 使用Navicat Premium 连接MySQL时出现如下错误: 原因 mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是cach ...

  6. Nginx 502错误总结

    http请求流程:一般情况下,提交动态请求的时候,nginx会直接把 请求转交给php-fpm,而php-fpm再分配php-cgi进程来处理相关的请求,之后再依次返回,最后由nginx把结果反馈给客 ...

  7. C为什么不能跨平台

    如果大家能对我的文章推荐一下,关注一下本人博客,那就更开心了,我今后也会更多的写一些计算机系统/原理类的文章,以飨各位读者.再次谢谢.前段时间看了 周志明的那本 <深入理解java虚拟机> ...

  8. 为什么分布式一定要有redis?(转)

    为什么分布式一定要有redis? 程序员小灰 6天前 点击上方“程序员小灰”,选择“置顶公众号” 有趣有内涵的文章第一时间送达! 作者:孤独烟 来自:http://rjzheng.cnblogs.co ...

  9. JavaScript this指向相关内容

    1,默认绑定this指向windw对象 看代码: function test(C){ var a = 123 function b(){}; } 在预编译环节当中. OA{ arguments:[1] ...

  10. Microsoft Windows Scripting Self-Paced Learning Guide

    http://www.mums.ac.ir/shares/hit/eduhit/book/windowsscripting.pdfhttp://support.microsoft.com/kb/926 ...