题目描述

最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律。

通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价为每股APi,第i天的股票卖出价为每股BPi(数据保证对于每个i,都有APi>=BPi),但是每天不能无限制地交易,于是股票交易所规定第i天的一次买入至多只能购买ASi股,一次卖出至多只能卖出BSi股。

另外,股票交易所还制定了两个规定。为了避免大家疯狂交易,股票交易所规定在两次交易(某一天的买入或者卖出均算是一次交易)之间,至少要间隔W天,也就是说如果在第i天发生了交易,那么从第i+1天到第i+W天,均不能发生交易。同时,为了避免垄断,股票交易所还规定在任何时间,一个人的手里的股票数不能超过MaxP。

在第1天之前,lxhgww手里有一大笔钱(可以认为钱的数目无限),但是没有任何股票,当然,T天以后,lxhgww想要赚到最多的钱,聪明的程序员们,你们能帮助他吗?

输入输出格式

输入格式:

输入数据第一行包括3个整数,分别是T,MaxP,W。(0<=W<T<=2000,1<=MaxP<=2000)

接下来T行,第i行代表第i-1天的股票走势,每行4个整数,分别表示APi,BPi,ASi,BSi。(1<=BPi<=APi<=1000,1<=ASi,BSi<=MaxP)

输出格式:

输出数据为一行,包括1个数字,表示lxhgww能赚到的最多的钱数。

输入样例#1:

5 2 0
2 1 1 1
2 1 1 1
3 2 1 1
4 3 1 1
5 4 1 1

输出样例#1:

3

题目分析:

dp[i][j]代表第i天有j股票数的赚的最多的钱。递推关系分三类:

1.不买不卖 则是dp[i-1][j];

2.买后手里有k,则是dp[i-w-1][k]-(j-k)*ap[i];

3.卖后还有k,则是dp[i-w-1][k]+(k-j)*bp[i];

首先循环i,j是必要的,但是还要枚举买卖多少,复杂度显然不够,因此用单调队列优化。

#include <bits/stdc++.h>
using namespace std;
const int N=;
int ap[N],bp[N],as[N],bs[N];
int dp[N][N],qu[N];
int main()
{
int n,maxp,w;
scanf("%d%d%d",&n,&maxp,&w);
for(int i=;i<=n;i++)
scanf("%d%d%d%d",&ap[i],&bp[i],&as[i],&bs[i]);
memset(dp,-0x7f,sizeof dp);
for(int i=;i<=n;i++) dp[i][]=;
for(int i=;i<=n;i++)
{
for(int j=;j<=as[i];j++) dp[i][j]=-ap[i]*j;
for(int j=maxp;j>=;j--) dp[i][j]=max(dp[i][j],dp[i-][j]);
if(i-w->=)
{
int head=,tail=;
for(int j=;j<=maxp;j++)
{
while(head<=tail&&qu[head]<j-as[i]) head++;//买入大于sa[i]的出队
while(head<=tail&&dp[i-w-][j]+ap[i]*j>=dp[i-w-][qu[tail]]+ap[i]*qu[tail]) tail--;
qu[++tail]=j;
if(head<=tail) dp[i][j]=max(dp[i][j],dp[i-w-][qu[head]]-ap[i]*j+ap[i]*qu[head]);
}
head=,tail=;
for(int j=maxp;j>=;j--)
{
while(head<=tail&&qu[head]>j+bs[i]) head++;//卖出大于bs[i]的出队
while(head<=tail&&dp[i-w-][j]+bp[i]*j>=dp[i-w-][qu[tail]]+bp[i]*qu[tail]) tail--;
qu[++tail]=j;
if(head<=tail) dp[i][j]=max(dp[i][j],dp[i-w-][qu[head]]-bp[i]*j+bp[i]*qu[head]);
}
}
}
int ans=;
for(int i=;i<=maxp;i++)
ans=max(ans,dp[n][i]);
printf("%d\n",ans);
return ;
}

最新文章

  1. 常用js函数封装
  2. c#控制打印机杂项
  3. 炉石ZZ操作 [20161224]
  4. 如何查看cache信息
  5. 2014 Super Training #1 B Fix 状压DP
  6. Sticky Footer (让页脚永远停靠在页面底部,而不是根据绝对位置)
  7. Android开发 将数据保存到SD卡
  8. c指针点滴2之比大小
  9. 用Javascript评估用户输入密码的强度(Knockout版)
  10. Android 5.0之前屏幕截图的方法
  11. phpcms v9 调用自定义字段多图片的第一张或第N张图为缩略图
  12. SSH搭建spring,使用依赖注入的方法
  13. Linux命令(五)创建文件或修改文件时间 touch
  14. eclipse卡死在search for main types 20 files to index
  15. odoo开发环境搭建(二):安装Ubuntu 17虚拟机
  16. 解决创建maven项目Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart问题
  17. ASP.NET MVC Castle Windsor 教程
  18. 用正则表达式匹配用rdf3x处理过后的TTL格式文档
  19. Python3入门机器学习 - k近邻算法
  20. BZOJ.4316.小C的独立集(仙人掌 DP)

热门文章

  1. JAVA加密解密DES对称加密算法
  2. jsp跳转标签&lt;jsp:forward&gt;
  3. 洛谷 P1433 吃奶酪
  4. 将SQL2008升级为SQL2008 r2
  5. HTTP协议初探
  6. JEECMS开发问题汇总
  7. python 基础之while无限循环
  8. vue入坑教程(三)vue父子组件之间互相调用方法以及互相传递数据
  9. Windows系统安装docker
  10. 01_1_jdom调用xml文件