HDU3401 Trade (动态规划+单调队列)
来源:互联网 发布:网络连接异常 编辑:程序博客网 时间:2024/05/18 02:00
/*知道之后n天的股票买卖价格(api,bpi),以及每天股票买卖数量上限(asi,bsi),问他最多能赚多少钱。开始时有无限本金,要求任两次交易需要间隔W天以上,即第i天交易,第i+w+1天才能再交易。同时他任意时刻最多只能拥有maxp的股票,容易写出DP方程 dp[i][j]=max{dp[i-1][j],max{dp[r][k]-APi[i]*(j-k)}(0<r<i-w,k<j),max{dp[r][k]+BPi[i]*(k-j)}(0<r<i-w,k>j)} 分别是第i天不交易,买股票和卖股票3种转移。第一眼看会发现这个方程十分冗杂,没有下手的地方。我们可以分析下,对于买卖股票的转移中的dp[r][k]中的r是否有枚举的价值,注意dp[i][j]中取最大时会考虑dp[i-1][j]的值,也就是dp[i-w-1][k]>=dp[r][k](0<r<i-w)恒成立。这样就省去了r 的枚举,但这还不够。以买股票为例,我们可以化简max{dp[i-w-1][k]-APi[i]*(j-k)}(k<j)},即dp[i-w-1][k]-APi[i]*(j-k)=dp[i-w-1][k]+APi[i]*k-APi[i]*j(k<j),可以发现对于确定的i和j只要取符合条件中最大的dp[i-w-1][k]+APi[i]*k即可,这个可以通过单调队列实现。*//*单调队列也就是分买入和卖出两种情况,对每一个i维护一个单调队列,这样可以在O(n)时间固定一个i,更新出dp[i][j]*/#include <cstdio>#include <iostream>#include <cmath>#include <algorithm>using namespace std;const double pi=acos(-1);const double EPS=1e-10;const int MAXN=2000+10;const int INF=1e9+7;int T;typedef long long ll;int ap[MAXN],bp[MAXN],as[MAXN],bs[MAXN];int dp[MAXN][MAXN];struct node{ int x;//存dp[i-w-1][k]+APi[i]*k或dp[i-w-1][k]+BPi[i]*k int p;//当前持股数} q[2005],temp;int s,e;int main(){ scanf("%d",&T); while(T--){ int t,maxp,w; scanf("%d%d%d",&t,&maxp,&w); for(int i=1;i<=t;i++){ scanf("%d%d%d%d",ap+i,bp+i,as+i,bs+i); } for(int i=0;i<=t;i++) for(int j=0;j<=maxp;j++) dp[i][j]=-INF; for(int i=1;i<=t;i++){ for(int j=0;j<=maxp;j++) if(j<=as[i]) dp[i][j]=max(dp[i-1][j],-j*ap[i]); else dp[i][j]=dp[i-1][j]; if(i-w-1<=0) continue; //买入 s=e=1; for(int j=0;j<=maxp;j++){ temp.p=j; temp.x=dp[i-w-1][j]+ap[i]*j; //入队 for(;s<e&&q[e-1].x<temp.x;e--); q[e++]=temp; //找最大值 for(;s<e&&q[s].p+as[i]<j;s++); dp[i][j]=max(dp[i][j],q[s].x-ap[i]*j); } s=e=1; //卖出 for(int j=maxp;j>=0;j--){ temp.p=j; temp.x=dp[i-w-1][j]+bp[i]*j; for(;s<e&&q[e-1].x<temp.x;e--); q[e++]=temp; for(;s<e&&q[s].p-bs[i]>j;s++); dp[i][j]=max(dp[i][j],q[s].x-bp[i]*j); } } int ans=0; for(int i=0;i<=maxp;i++){ ans=max(ans,dp[t][i]); } printf("%d\n",ans); }}
阅读全文
0 0
- HDU3401 Trade (动态规划+单调队列)
- 单调队列 hdu3401 Trade
- 【DP+单调队列】 hdu3401 Trade
- [单调队列DP] HDU3401 Trade
- Trade-----HDU3401----单调队列优化的DP
- hdu3401 Trade 单调队列优化dp
- [HDU3401]Trade && 单调队列优化DP
- hdu3401 Trade 单调队列优化DP
- hdu3401 Trade [单调队列优化dp]
- hdu3401 Trade(单调队列优化dp)
- 【HDU3401】Trade-单调队列优化DP
- [hdu3401] Trade DP单调队列优化
- 单调队列 例子:hdu3401 trade(dp加单调队列)
- Hdu3401 Trade(dp 单调队列优化)最详细题解
- HDU3401 单调队列优化DP
- 【HDU3401】Trade
- 【HDU3401】Trade
- 单调队列优化动态规划
- PlayFramework安装
- 使用PHPStorm实现远程调试
- position中的sticky
- The study of how to define a function in Python(20170907)
- 欧拉筛
- HDU3401 Trade (动态规划+单调队列)
- ANSYS中表格数组的定义及使用举例
- Lua_表结构_007
- spring DI
- android su 白名单 [续]
- 控制台
- 数据库面试技巧,通过JDBC展示自己专业性,摘自java web轻量级开发面试教程
- CCF考试Java试题--差1数对
- 二、Spring Cloud 的 Eureka 组件