bzoj1855 股票交易 动态规划&单调队列
2016-01-05 22:01
316 查看
动态规划,设f[i][j]为第i天股票j的最大收益,有三种转移:
1.不操作,f[i][j]=f[i-1][j];
2.买入,f[i][j]=max{f[i-w-1][k]+(k-j)*api},其中,j-asi<=k<j;
3.卖出,f[i][j]=max{f[i-w-1][k]+(k-j)*bpi},其中,j<k<=j+bsi。
后面两种都可以用单调队列维护f[i-w-1][k]+k*api(bpi)来优化,于是转移O(1)。注意初值
AC代码如下:
by lych
2016.1.5
1.不操作,f[i][j]=f[i-1][j];
2.买入,f[i][j]=max{f[i-w-1][k]+(k-j)*api},其中,j-asi<=k<j;
3.卖出,f[i][j]=max{f[i-w-1][k]+(k-j)*bpi},其中,j<k<=j+bsi。
后面两种都可以用单调队列维护f[i-w-1][k]+k*api(bpi)来优化,于是转移O(1)。注意初值
AC代码如下:
#include<iostream> #include<cstdio> #define N 2005 #define inf 1000000000 using namespace std; int n,m,w,f ,q ; int main(){ scanf("%d%d%d",&n,&m,&w); int i,j,x,y,u,v; for (i=1; i<=m; i++) f[0][i]=-inf; for (i=1; i<=n; i++){ scanf("%d%d%d%d",&x,&y,&u,&v); for (j=0; j<=m; j++) f[i][j]=f[i-1][j]; int last=max(0,i-w-1),head=1,tail=1; q[1]=0; for (j=1; j<=m; j++){ if (q[head]<j-u) head++; f[i][j]=max(f[i][j],f[last][q[head]]+x*(q[head]-j)); while (head<=tail && f[last][j]+x*j>=f[last][q[tail]]+x*q[tail]) tail--; q[++tail]=j; } head=tail=1; q[1]=m; for (j=m-1; j>=0; j--){ if (q[head]>j+v) head++; f[i][j]=max(f[i][j],f[last][q[head]]+y*(q[head]-j)); while (head<=tail && f[last][j]+y*j>=f[last][q[tail]]+y*q[tail]) tail--; q[++tail]=j; } } int ans=-inf; for (i=0; i<=m; i++) ans=max(ans,f [i]); printf("%d\n",ans); return 0; }
by lych
2016.1.5
相关文章推荐
- 那些成功学和鸡汤文没有告诉你的事
- phpcms V9 常用函数 及 代码整理
- 工厂三兄弟之抽象工厂模式(四):界面皮肤库解决方案
- 搭建iscsi共享存储
- 我的VIM入门
- 工资发放系统
- STL详解
- leetcode笔记:Leetcode Letter Combinations of a Phone Number
- Oracle学习之buffer cache(copy过来的文本,待补充笔记)
- Python机器学习库scikit-learn实践
- leetcode之4Sum
- OC中的属性
- 若干年后自己是否会想起在这里的加密
- 机器学习中的范数规则化之(一)L0、L1与L2范数
- svn的使用总结
- svn的使用总结
- Oracle VM VirtualBox 安装
- 自定义view实现跑马灯效果
- Qt多线程操作界面---在QThread更新QProgressBar
- [Python标准库]pprint——美观打印数据结构