HDU 3401 Trade (单调队列优化DP)
2014-03-01 11:15
288 查看
http://acm.hdu.edu.cn/showproblem.php?pid=3401
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; #define N 2399 #define inf 0xfffffff struct data { int v,k; bool operator<(data a)const { return v>a.v; } data(int a=0,int b=0) { v=a,k=b; } }q ; int n,maxp,W, AP ,BP ,AS ,BS ; int dp ; int main() { int re; cin>>re; while(re--) { cin>>n>>maxp>>W; for(int i=1;i<=n;i++) scanf("%d%d%d%d",AP+i,BP+i,AS+i,BS+i); for(int i=0;i<=n;i++) for(int j=0;j<=maxp;j++) dp[i][j]=-inf; dp[0][0]=0; /// priority_queue<data> q ,qq ; for(int i=1;i<=W+1;i++) for(int j=0;j<=min(AS[i],maxp);j++) dp[i][j]=-AP[i]*j; for(int i=2;i<=n;i++) for(int j=0;j<=maxp;j++) dp[i][j]=max(dp[i][j],dp[i-1][j]); for(int i=W+2 ;i<=n;i++) { for(int j=0;j<=maxp;j++) ; if(i<=W+1) continue; int pre=i-W-1; ///buy int head=0,tail=-1; for(int j=0;j<=maxp;j++) { dp[i][j]=max(dp[i][j],dp[i-1][j]); data tmp=data(dp[i-W-1][j]+j*AP[i],j); // data tmp=q[i-W-1].top(); q[i-W-1].pop(); while(head<=tail&& q[tail].v<tmp.v ) tail--; q[++tail]=tmp; while(head<=tail&& j-q[head].k > AS[i]) head++; if(head<=tail) dp[i][j]=max(dp[i][j], q[head].v -j*AP[i]); } ///sell head=0, tail=-1; for(int j=maxp;j>=0;j--) { dp[i][j]=max( dp[i][j], dp[i-1][j] ); data tmp=data( dp[pre][j]+ j*BP[i], j ); ///data tmp= qq[i-W-1].top(); qq[i-W-1].pop(); while(head<=tail && q[tail].v<tmp.v ) tail--; q[++tail]=tmp; while(head<=tail&& q[head].k-j>BS[i] ) head++; if(head<=tail) dp[i][j]=max(dp[i][j] , q[head].v - j*BP[i] ); } } int ans=0; for(int j=0;j<=maxp;j++) ans=max(ans,dp [j]); cout<<ans<<endl; } }
相关文章推荐
- [ACM] hdu 2544 最短路(dijkstra算法)
- 工厂方法模式
- win7硬盘安装Centos 6.5 64位双系统
- ACM-5
- web api 获取传过来的Json
- Android Input设备debug技巧
- Android Adb Analyse
- Qt模块化笔记之core——使用信号与槽
- nginx+php 限制每个站点的目录范围,防止跨站
- struts2动态方法调用
- extern和volatile的用法
- 使用VBS控制声音
- 如何实现图片随机切换
- WPF Blend Grid 布局
- 使用Xcode修改iOS项目工程名和路径名
- sql 交叉表查询
- linux request_module
- 如何编写DLL文件(开发环境VS2005)
- Android开发学习之QQ好友列表的实现
- php环境搭建