博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu-3401-Trade-单调队列优化的DP
阅读量:6177 次
发布时间:2019-06-21

本文共 1727 字,大约阅读时间需要 5 分钟。

单调队列入门题。。。

dp[i][j]:第i天。手中拥有j个股票时,获得的最大利润。

若第i天不买不卖:dp[i][j]=max(dp[i][j],dp[i-1][j]);

若第i天买            :dp[i][j]=max(dp[i][j],dp[i-w-1][k]-(j-k)*ap[i]);

若第i天卖            :dp[i][j]=max(dp[i][j],dp[i-w-1][k]+(k-j)*bp[i]);

若仅仅考虑买的情况:

dp[i][j]=dp[i-w-1][k]+ap[i]*k-j*ap[i];

非常明显。能够用单调队列优化dp[i-w-1][k]+ap[i]*k。

#include
#include
#include
#include
#include
using namespace std;//#define INF ((1<<30)-1)#define INF 0xfffff#define maxn 2200#define LL long long#define MOD 1000000009int dp[2200][2200];struct list{ int val; int x;} p[5001],q;int ap[maxn],bp[maxn],as[maxn],bs[maxn];int main(){ int Ts; int n,m,w,i,j; scanf("%d",&Ts); while(Ts--) { scanf("%d%d%d",&n,&m,&w); for(i=0; i<=n; i++) for(j=0; j<=m; j++)dp[i][j]=-INF; int head,tail; for(i=1;i<=n;i++)scanf("%d%d%d%d",&ap[i],&bp[i],&as[i],&bs[i]); for(j=1;j<=w+1;j++) for(i=0;i<=min(as[j],m);i++) dp[j][i]=-1*ap[j]*i; for(i=2; i<=n; i++) { for(j=0;j<=m;j++)dp[i][j]=max(dp[i-1][j],dp[i][j]); if(i<=w+1)continue; head=1; tail=0; for(j=0; j<=m; j++) { q.x=j; q.val=dp[i-w-1][j]+ap[i]*j; while(tail>=head&&q.val>p[tail].val)tail--; p[++tail]=q; while(tail>=head&&p[head].x
=0;j--) { q.x=j; q.val=dp[i-w-1][j]+bp[i]*j; while(tail>=head&&q.val>p[tail].val)tail--; p[++tail]=q; while(tail>=head&&p[head].x>j+bs[i])head++; if(head<=tail)dp[i][j]=max(dp[i][j],p[head].val-bp[i]*j); } } int maxx=0; for(i=0;i<=m;i++)maxx=max(maxx,dp[n][i]); printf("%d\n",maxx); } return 0;}

转载地址:http://llwda.baihongyu.com/

你可能感兴趣的文章
trigger()
查看>>
nvm 怎么安装 ?
查看>>
Java VM里的magic
查看>>
[Node.js]Domain模块
查看>>
Linux操作系统文档
查看>>
利用Tensorflow训练自定义数据
查看>>
c++官方文档-枚举-联合体-结构体-typedef-using
查看>>
[题解]UVA11029 Leading and Trailing
查看>>
利用vue-gird-layout 制作可定制桌面 (一)
查看>>
校园社交网站app
查看>>
如何指定某些文件关闭ARC
查看>>
4、跃进表
查看>>
JAVA面向对象的总结(静态函数与static关键字)
查看>>
课堂作业第四周课上作业一
查看>>
使用Java语言开发微信公众平台(七)——音乐消息的回复
查看>>
陶哲轩实分析习题9.1.6
查看>>
常用音频软件:Cool edit pro
查看>>
努力的方向,除了诗和远方,还有一堆技术。
查看>>
SQL CHECK 约束
查看>>
git提交到一半关闭时
查看>>