HDU4341-Gold miner-分组DP
2016-02-29 22:51
267 查看
模拟黄金矿工这个游戏,给出每一个金子的位置和所需时间,计算在给定时间内最大收益。
刚看这道题以为金子的位置没什么用,直接DP就行,WA了一发终于明白如果金子和人共线的话只能按顺序抓。
这就是需要考虑先后关系问题。看了背包⑨讲之后以为是“有依赖关系的背包”,感觉解决方案很不明显,想不出来做法。
后来想到,可以把共线的金子按1,1+2,1+2+3。。。变成若干个,然后共线的金子组成一组。
显然这个问题就变成了在组内互斥的情况下的分组DP,背包⑨讲已经给出了伪代码。
预处理的时候使用了优先队列,map,乱搞了一下就好了。。。//好不容易自己写出来了一道不太水的题。。。
刚看这道题以为金子的位置没什么用,直接DP就行,WA了一发终于明白如果金子和人共线的话只能按顺序抓。
这就是需要考虑先后关系问题。看了背包⑨讲之后以为是“有依赖关系的背包”,感觉解决方案很不明显,想不出来做法。
后来想到,可以把共线的金子按1,1+2,1+2+3。。。变成若干个,然后共线的金子组成一组。
显然这个问题就变成了在组内互斥的情况下的分组DP,背包⑨讲已经给出了伪代码。
预处理的时候使用了优先队列,map,乱搞了一下就好了。。。//好不容易自己写出来了一道不太水的题。。。
#include <cstdio> #include <algorithm> #include <cstring> #include <queue> #include <stack> #include <map> using namespace std; const int maxn = 200+10; struct node { int x,y; int w,v; node(){x=0;y=0;w=0;v=0;} node(int x,int y) {w=x;v=y;} bool operator < (const node &b) const { return x*x+y*y > b.x*x+b.y*y; } }gold[maxn]; struct item { int w,v; item(){w=0;v=0;} item(int a,int b){w=a;v=b;} }; int x[maxn],y[maxn],w[maxn],v[maxn],dp[40010]; int N,T; vector <item> itm[maxn]; int main() { int cas = 1; while(~scanf("%d%d",&N,&T)) { map<pair<int,int> , int > mp; priority_queue<node> pq[maxn]; int cnt_group = 0; for(int i=0;i<maxn;i++) itm[i].clear(); for(int i=0,x,y;i<N;i++) { scanf("%d%d%d%d",&gold[i].x,&gold[i].y,&gold[i].w,&gold[i].v); x = gold[i].x;y = gold[i].y; if(mp.count(pair<int,int>( x/__gcd(x,y) , y/__gcd(x,y)) )) { pq[mp[pair<int,int>( x/__gcd(x,y) , y/__gcd(x,y))]].push(gold[i]); } else { mp[pair<int,int>( x/__gcd(x,y) , y/__gcd(x,y))]=cnt_group++; pq[mp[pair<int,int>( x/__gcd(x,y) , y/__gcd(x,y))]].push(gold[i]); } } map<pair<int,int>,int >::iterator it; node cur; for(int i=0;i<cnt_group;i++) { cur = node(0,0); while(!pq[i].empty()) { cur.w += pq[i].top().w; cur.v += pq[i].top().v; pq[i].pop(); itm[i].push_back(item(cur.w,cur.v)); //printf("grp:%d w:%d v:%d\n",i,cur.w,cur.v); } } memset(dp,0,sizeof dp); for(int gp=0;gp<cnt_group;gp++) { int n = itm[gp].size(); for(int t=T;t>=0;t--) { for(int i=0;i<n;i++) if(t>=itm[gp][i].w) { //printf("t:%d w:%d\n",t,itm[gp][i].w); dp[t] = max(dp[t],dp[t-itm[gp][i].w] + itm[gp][i].v); } } //for(int i=0;i<T;i++) //printf("%d ",dp[i]); //printf("\n"); } printf("Case %d: %d\n",cas++,dp[T]); } }
相关文章推荐
- Google2015校招在线測试题1----扫雷最少点击次数
- 算法代码实现之三向切分快速排序,Golang(Go语言)实现
- [HDU3966]Aragorn's Story(树链剖分)
- hdu 3966 Aragorn's Story
- 【全排列】next_permutation函数 【algorithm】
- Django学习-01
- 算法代码实现之快速排序,Golang(Go语言)实现
- 我读Mongoose源码----程序框架
- django 模块 template(filter)
- 删除GoldenGate
- mongoengine 查询
- mongoengine 常用类型
- 原创翻译:James Whittaker系列——Google是如何测试的(4)
- 【Google Earth】pro之视频录制
- Leangoo:用敏捷开发管理思维做团队协作的SaaS软件
- 第1周周赛——开学第一课(题解)——出自(Codeforces Good Bye 2015 和 HDU1717)
- Django Xadmin安装
- 下定决心博客搬家(再见csdn,For my oschina!)本博客不再更新,请访问my.oschina.net/tantexian,Thanks dear csdn, goodbye!
- Django 开发服务器启动时发生Error: [Errno 10013] 1错误
- Django~Test View