0%

股票交易

最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律。
通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价为每股AP_i,第i天的股票卖出价为每股BP_i(数据保证对于每个i,都有),但是每天不能无限制地交易,于是股票交易所规定第i天的一次买入至多只能购买AS_i股,一次卖出至多只能卖出BS_i股。
另外,股票交易所还制定了两个规定。为了避免大家疯狂交易,股票交易所规定在两次交易(某一天的买入或者卖出均算是一次交易)之间,至少要间隔W天,也就是说如果在第i天发生了交易,那么从第i+1天到第i+W天,均不能发生交易。同时,为了避免垄断,股票交易所还规定在任何时间,一个人的手里的股票数不能超过MaxP。
在第1天之前,lxhgww手里有一大笔钱(可以认为钱的数目无限),但是没有任何股票,
当然,T天以后,lxhgww想要赚到最多的钱,聪明的程序员们,你们能帮助他吗?

输入描述:

输入数据第一行包括3个整数,分别是T,MaxP,W。
接下来T行,第i行代表第i-1天的股票走势,每行4个整数,分别表示AP_i,BP_i,AS_i,BS_i。0<=W<T<=2000, 1<=MaxP<=2000, 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

输出

3

gupiaojiaoyi.cppview raw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include<bits/stdc++.h>
#define M 2005
using namespace std;
struct node{
int ap,bp,as,bs;
}A[M];
int dp[M][M];
int INF;
struct Node{
int v,id;
}Q[M];
int main(){
int n,m,W;
cin>>n>>m>>W;
for(int i=1;i<=n;i++){
cin>>A[i].ap>>A[i].bp>>A[i].as>>A[i].bs;
}
memset(dp,-127,sizeof(dp));
for(int i=1;i<=W+1;i++){
for(int j=0;j<=m;j++){
if(j<=A[i].as)dp[i][j]=-j*A[i].ap;
if(i>1)dp[i][j]=max(dp[i][j],dp[i-1][j]);
}
}
for(int i=W+2;i<=n;i++){
int ii=i-W-1;
int L=0,R=-1;
for(int j=m;j>=0;j--){//卖
Node tmp;
tmp.v=dp[ii][j]+j*A[i].bp; tmp.id=j;
while(L<=R&&Q[R].v<=tmp.v)R--;
Q[++R]=tmp;
while(L<=R&&Q[L].id-j>A[i].bs)L++;
dp[i][j]=Q[L].v-j*A[i].bp;
}
L=0,R=-1;
for(int j=0;j<=m;j++){//买
Node tmp;
tmp.v=dp[ii][j]+j*A[i].ap; tmp.id=j;
while(L<=R&&Q[R].v<=tmp.v)R--;
Q[++R]=tmp;
while(L<=R&&j-Q[L].id>A[i].as)L++;
dp[i][j]=max(dp[i][j],Q[L].v-j*A[i].ap);
}
for(int j=0;j<=m;j++){
dp[i][j]=max(dp[i][j],dp[i-1][j]);
// printf("%d %d %d\n",i,j,dp[i][j]);
}
/*
for(int j=0;j<=m;j++){
{
for(int jj=j;jj<=min(j+A[i].bs,m);jj++)//卖
dp[i][j]=max(dp[i][j],dp[ii][jj]+jj*A[i].bp)-j*A[i].bp);


for(int jj=j;jj>=max(0,j-A[i].as);jj--)//买
dp[i][j]=max(dp[i][j],dp[ii][jj]+jj*A[i].ap)-j*A[i].ap);
}
dp[i][j]=max(dp[i][j],dp[i-1][j]);
}*/
}
int ans=0;
for(int j=0;j<=m;j++)ans=max(ans,dp[n][j]);
printf("%d\n",ans);
return 0;
}