hdu 2191 (多重背包的单调队列优化)
来源:互联网 发布:手机黄金探测仪软件 编辑:程序博客网 时间:2024/06/05 08:50
多重背包单调队列优化是思想是。普通的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-k)*w[i] }=max{dp[b+k*v[i]]-k*w[i]}+x*w[i] ; (x-c[i]<=k && k<=x)
实际上一个j对于一个x和b,那么可以看出实际上就是几率一段x之前的c[i]区间内的最值。这是一个很明显的单调队列优化。
#include <set>#include <map>#include <queue>#include <stack>#include <cmath>#include <string>#include <cctype>#include <cstdio>#include <cstdlib>#include <cstring>#include <iomanip>#include <iostream>#include <algorithm>using namespace std;typedef __int64 LL;const int mmax = 1000010;const int inf = 0x3fffffff;int p[110],h[110],c[110];int dp[110][110];int Q[110];int head,tail;void add(int b,int i,int k){ while(head<tail && dp[i-1][b+Q[tail-1]*p[i]]-Q[tail-1]*h[i]<=dp[i-1][b+k*p[i]]-k*h[i]) tail--; Q[tail++]=k;}int main(){ int n,m,T; cin>>T; while(T--) { scanf("%d %d",&n,&m); for(int i=1;i<=m;i++) scanf("%d %d %d",&p[i],&h[i],&c[i]); memset(dp,0,sizeof dp); for(int i=1;i<=m;i++) { for(int j=0;j<p[i];j++) { head=tail=0; for(int k=0;j+k*p[i]<=n;k++) { add(j,i,k); if( k-c[i]-1== Q[head] ) { head++; } dp[i][j+k*p[i]]=dp[i-1][j+Q[head]*p[i]]-Q[head]*h[i]+k*h[i]; } } } int ans=0; for(int i=0;i<=n;i++) ans=max(ans,dp[m][i]); cout<<ans<<endl; } return 0;}
0 0
- hdu 2191 (多重背包的单调队列优化)
- 单调队列优化的多重背包
- 多重背包的单调队列优化
- 多重背包单调队列优化
- 单调队列优化多重背包
- 单调队列优化多重背包
- 单调队列优化多重背包
- 多重背包,二进制优化,单调队列优化
- 多重背包问题的单调队列优化 转载
- 动态规划的单调队列优化(含多重背包)
- 多重背包的优化 二进制/单调队列解析
- hdu2191多重背包单调队列优化
- Dividing(多重背包、单调队列优化dp)
- 多重背包(单调队列优化)
- poj1742 单调队列优化多重背包
- 多重背包(单调队列优化)
- poj1014多重背包--单调队列优化
- hdu1171 (单调队列优化多重背包)
- 基础知识学习笔记(一)
- 在servlet中使用json-lib报错--java.lang.NoClassDefFoundError: net/sf/json/JSONObject
- 解题报告:置换的玩笑
- Springmvc+mybatis+maven查询分页完美封装版
- KVC简单介绍 -字典转模型,模型转字典
- hdu 2191 (多重背包的单调队列优化)
- 美团和大众点评的O2O之困
- [BZOJ2200][Usaco2011 Jan]道路和航线
- Project Euler:Problem 71 Ordered fractions
- Tree结构数据拆分成List集合算法
- Redis 起步
- python生成新文件
- NYOJ 570 解题报告
- 为什么Android手机越用越慢