HDU 3401 Trade(单调队列优化)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3401

题意:炒股。第i天买入一股的价钱api,卖出一股的价钱bpi,最多买入asi股,最多卖出bsi股。两次操作(买入或卖出)中间必须相差W天。炒股时间为n。任意时间手中的股票不大于MaxP。求最大收益。

dp[i][j]代表第i天手上有j股的最大收益,dp[i][j]=max(dp[i-1][j],dp[i-W][k]+(j-k)*ap[i],dp[i-W][k]+(k-j)*bp[i]);

dp[i-W][k]+j*ap[i]-k*ap[i];

dp[i-W][k]+k*bp[i]-j*bp[i];

用单调队列维护

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<string>
 6 #include<algorithm>
 7 #define inf 0x7fffffff
 8 struct op{
 9     int x,p;
10 }q[20005],temp;
11 int n,m,w;
12 int ap[2005],bp[2005],as[2005],bs[2005];
13 int dp[2005][2005],h,t;
14 int main(){
15     int Tcase;
16     scanf("%d",&Tcase);
17     while (Tcase--){
18         scanf("%d%d%d",&n,&m,&w);
19         for (int i=1;i<=n;i++)
20          scanf("%d%d%d%d",&ap[i],&bp[i],&as[i],&bs[i]);
21         for (int i=1;i<=n;i++)
22          for (int j=0;j<=m;j++)
23           dp[i][j]=-inf;
24         for (int i=1;i<=w+1;i++)
25          for (int j=0;j<=as[i];j++)
26           dp[i][j]=-ap[i]*j;
27         for (int i=2;i<=n;i++){
28             for (int j=0;j<=m;j++)
29              dp[i][j]=std::max(dp[i][j],dp[i-1][j]);
30             if (i<=w+1) continue;
31             h=t=1;
32             for (int j=0;j<=m;j++){
33                 temp.p=j;
34                 temp.x=dp[i-w-1][j]+ap[i]*j;
35                 for (;h<t&&q[t-1].x<temp.x;t--);
36                 q[t++]=temp;
37                 for (;h<t&&q[h].p+as[i]<j;h++);
38                 dp[i][j]=std::max(dp[i][j],q[h].x-ap[i]*j);
39             }
40             h=t=1;
41             for (int j=m;j>=0;j--){
42                 temp.p=j;
43                 temp.x=dp[i-w-1][j]+bp[i]*j;
44                 for (;h<t&&q[t-1].x<temp.x;t--);
45                 q[t++]=temp;
46                 for (;h<t&&q[h].p-bs[i]>j;h++);
47                 dp[i][j]=std::max(dp[i][j],q[h].x-bp[i]*j);
48             }
49         }
50         int ans=0;
51         for (int i=0;i<=m;i++)
52          ans=std::max(ans,dp[n][i]);
53         printf("%d\n",ans);
54     }
55 }
时间: 2024-09-30 06:37:26

HDU 3401 Trade(单调队列优化)的相关文章

hdu3401 Trade(单调队列优化dp)

Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4734    Accepted Submission(s): 1587 Problem Description Recently, lxhgww is addicted to stock, he finds some regular patterns after a few d

HDU 3401 Trade(斜率优化dp)

http://acm.hdu.edu.cn/showproblem.php?pid=3401 题意:有一个股市,现在有T天让你炒股,在第i天,买进股票的价格为APi,卖出股票的价格为BPi,同时最多买进股票的数量为ASi,卖出股票的数量为BSi.一次交易之后要隔W天之后才能再次交易,并且手上最多持股maxP,问最多可以炒到多少钱. 思路: 首先列一个DP方程: 分别代表不买不卖,买进股票,卖出股票三种情况(上面 (j-k)<=AS[i] , (k-j)<=BS[i]). 那么这里需要枚举r和k

HDU 3507 PrintArticle (单调队列优化)

题意:给出一个数列C,一个数字M,将数列分成若干段,每段的代价为(设这段的数字为k个): dp[i]=min(dp[j]+(sum[i]-sum[j])*(sum[i]-sum[j])+M) 若j1<j2且j2比j1优 dp[j1]+sum[i]^2+sum[j1]^2-2*sum[i]*sum[j1]+M>dp[j2]+sum[i]^2+sum[j2]^2-2*sum[i]*sum[j2] dp[j1]-dp[j2]+sum[j1]^2-sum[j2]^2>2*sum[i]*(sum[

HDU 3401 Trade dp 单调队列优化

戳这里:3401 题意:给出第 i 天的股票买卖价格(APi,BPi),以及每天股票买卖的数量上限(ASi,BSi),要求任两次交易需要间隔 W 天以上,即第 i 天交易,第 i + W + 1 天才能再交易,求最多能赚多少钱 思路:dp[i][j] = max(dp[i - 1][j], max(dp[f][k] - (j - k) * APi[i]), max(dp[f][k] + (k - j) * BPi[i])); 从式子中观察出,若两天都持有股票数 j 时,之后的那一天所赚的钱不小于

HDU 4122 Alice&#39;s mooncake shop 单调队列优化dp

Alice's mooncake shop Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4122 Description The Mid-Autumn Festival, also known as the Moon Festival or Zhongqiu Festival is a popular harvest festival celebrated by Ch

hdu 2191 (多重背包的单调队列优化)

多重背包单调队列优化是思想是.普通的dp为 dp[i][j]=max{dp[i-1][j-k*v[i]]+k*w[i]}; 其实你可以发现对能更新j是j和一个剩余类.也就是 0, v[i],2v[i],3v[i] ,4v[i]... 1 ,1+v[i],1+2v[i],1+3v[i] ........... v[i]-1,2*v[i]-1...... 更新值存在一个剩余类中,组与组之间不存在更新.那么实际上我们可以写dp写好这样 dp[b+x*v[i]]=max{ dp[b+k*v[i]]+(x

HDU - 3401 Trade

题意:让你炒股票,每天都有买进的额度和价格以及卖出的额度和价格,并规定时间和最多的持有股票是多少,而且买卖操作要隔w+1天求最高的利润 思路:显然分三种情况:不买不卖,买,卖,设dp[i][j]表示第i天持有j股票的最高利润 如果不买不卖的话就是:dp[i][j]=dp[i-1][j] 买: dp[i][j]=max(dp[i][j],dp[pre][k]-(j-k)*ap[i]) 卖: dp[i][i]=max(dp[i][j],dp[pre][k]+(k-j)*bp[i]) 拿买来说的话:d

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

1855: [Scoi2010]股票交易 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1083  Solved: 519[Submit][Status][Discuss] Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价为每股APi,第i天的股票卖出价为每股BPi(数据保证对于每个i,都有APi>=

Parade(单调队列优化dp)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 902    Accepted Submission(s): 396 Problem Description Panagola, The Lord of city F lik