HDU 4616 Game (搜索)、(树形dp)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4616
这道题目数据可能比较弱,搜索都可以AC,但是不敢写,哎……
搜索AC代码:
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <string>
- #include <cstdlib>
- #include <cmath>
- #include <vector>
- #include <list>
- #include <deque>
- #include <queue>
- #include <iterator>
- #include <stack>
- #include <map>
- #include <set>
- #include <algorithm>
- #include <cctype>
- #include <ctime>
- #pragma comment(linker, "/STACK:16777216")
- using namespace std;
- typedef __int64 LL;
- const int N=50005;
- const int M=55555555;
- const int INF=0x3f3f3f3f;
- const double PI=acos(-1.0);
- vector<int>q[N];
- int xh[N],w[N];
- int n,c,sm;
- bool vis[N];
- struct love
- {
- int i,sum;
- int cc;
- }r,e,my[M];
- void BFS(int s)
- {
- memset(vis,0,sizeof(vis));
- vis[s]=1;
- vector<int>::iterator it;
- r.i=s;
- r.sum=xh[s]; sm=max(sm,r.sum);
- r.cc=c-w[s];
- if(r.cc==0)
- return ;
- int he=0,ta=0;
- my[ta++]=r;
- while(he!=ta)
- {
- e=my[he++];
- if(he==M)
- he=0;
- for(it=q[e.i].begin();it!=q[e.i].end();it++)
- {
- r=e;
- int k=*it;
- if(vis[k]) continue;
- vis[k]=1;
- r.i=k;
- r.sum+=xh[k]; sm=max(sm,r.sum);
- r.cc-=w[k];
- if(r.cc>0)
- {
- my[ta++]=r;
- if(ta==M)
- ta=0;
- }
- }
- }
- }
- int main()
- {
- int T;
- scanf("%d",&T);
- while(T--)
- {
- scanf("%d%d",&n,&c);
- for(int i=0;i<n;i++)
- {
- scanf("%d%d",&xh[i],&w[i]);
- }
- for(int i=0;i<=n;i++)
- q[i].clear();
- for(int i=0;i<n-1;i++)
- {
- int a,b;
- scanf("%d%d",&a,&b);
- q[a].push_back(b);
- q[b].push_back(a);
- }
- int Max=-1;
- for(int i=0;i<n;i++)
- {
- sm=0;
- if(q[i].size()==1)
- BFS(i);
- if(Max<sm)
- Max=sm;
- }
- cout<<Max<<endl;
- }
- return 0;
- }
树形DP代码:
- #include <iostream>
- #include <cstdio>
- #include <vector>
- #include <cstring>
- using namespace std;
- #define N 50500
- int trap[N],val[N],n,C,vis[N],ans;
- int dp[N][5][2];
- vector<int>vec[N];
- void DP(int u)
- {
- vis[u]=1;
- dp[u][trap[u]][0]=dp[u][trap[u]][1]=val[u];
- int v;
- for(int i=0;i<vec[u].size();++i)
- {
- v=vec[u][i];
- if(vis[v]) continue;
- DP(v);
- for(int j=0;j<=C;++j)
- for(int k=0;j+k<=C;++k)
- {
- if(j!=C) // j=C的时候已经停止了,不会再往子节点跑了
- ans=max(ans,dp[u][j][0]+dp[v][k][1]);
- if(k!=C) // 同理
- ans=max(ans,dp[u][j][1]+dp[v][k][0]);
- if(j+k<C) // 0表示从子树方向往根节点跑,子树可能是非陷阱的点,
- //假如j+k==C,题意要求到达C要停止,但按dp[v][k][0]记录的,还会继续跑,所以不行
- ans=max(ans,dp[u][j][0]+dp[v][k][0]);
- //if(j+k<C)
- //ans=max(ans,dp[u][j][1]+dp[v][k][1]);
- }
- for(int j=0;j+trap[u]<=C;++j)
- dp[u][j+trap[u]][0]=max(dp[u][j+trap[u]][0],dp[v][j][0]+val[u]);
- for(int j=1;j+trap[u]<=C;++j) // 1表示从根节点往下走的,1->0是不可取的,因为算上1后,已经满C了,就不会再走了,所以不能更新
- dp[u][j+trap[u]][1]=max(dp[u][j+trap[u]][1],dp[v][j][1]+val[u]);
- }
- }
- int main ()
- {
- int ncase;scanf("%d",&ncase);
- while(ncase--)
- {
- scanf("%d%d",&n,&C);
- for(int i=0;i<n;++i)
- vec[i].clear();
- memset(vis,0,sizeof(vis));
- memset(dp,0,sizeof(dp));
- ans=0;
- for(int i=0;i<n;++i)
- scanf("%d%d",&val[i],&trap[i]);
- int u,v;
- for(int i=1;i<n;++i)
- {
- scanf("%d%d",&u,&v);
- vec[u].push_back(v);
- vec[v].push_back(u);
- }
- DP(0);
- printf("%d\n",ans);
- }
- return 0;
- }
HDU 4616 Game (搜索)、(树形dp)的更多相关文章
- Install Air Conditioning HDU - 4756(最小生成树+树形dp)
Install Air Conditioning HDU - 4756 题意是要让n-1间宿舍和发电站相连 也就是连通嘛 最小生成树板子一套 但是还有个限制条件 就是其中有两个宿舍是不能连着的 要求所 ...
- POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题
一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加. 要求: 1.为了聚会有趣,若邀请了一个职员,则该职员的直接上级(即父节点)和直接下级(即儿子节点) ...
- hdu 5452 Minimum Cut 树形dp
Minimum Cut Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=54 ...
- HDU 1520 Anniversary party [树形DP]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题目大意:给出n个带权点,他们的关系可以构成一棵树,问从中选出若干个不相邻的点可能得到的最大值为 ...
- hdu 1520Anniversary party(简单树形dp)
Anniversary party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- HDU 3586 二分答案+树形DP判定
HDU 3586 『Link』HDU 3586 『Type』二分答案+树形DP判定 ✡Problem: 给定n个敌方据点,1为司令部,其他点各有一条边相连构成一棵树,每条边都有一个权值cost表示破坏 ...
- HDU 3586.Information Disturbing 树形dp 叶子和根不联通的最小代价
Information Disturbing Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/ ...
- HDU 5293 Annoying problem 树形dp dfs序 树状数组 lca
Annoying problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 Description Coco has a tree, w ...
- HDU - 3586 Information Disturbing 树形dp二分答案
HDU - 3586 Information Disturbing 题目大意:从敌人司令部(1号节点)到前线(叶子节点)的通信路径是一个树形结构,切断每条边的联系都需要花费w权值,现在需要你切断前线和 ...
- HDU 1011 Starship Troopers 树形DP 有坑点
本来是一道很水的树形DP题 设dp[i][j]表示,带着j个人去攻打以节点i为根的子树的最大收益 结果wa了一整晚 原因: 坑点1: 即使这个节点里面没有守卫,你如果想获得这个节点的收益,你还是必须派 ...
随机推荐
- .NET vs JAVA
一个同事写一个方案,让我补充下.NET和 JAVA语言的优缺点,以下是我的回复: 老X你好! 我觉得这个问题,本质上不是java和.net两个开发语言方面的比较,单纯从这两个开发语言来讲,部分伯仲,在 ...
- Delphi的RTTI还分为对类和对象的判断,以及对普通属性的判断——相比之下,C++的RTTI实在太弱!
堂堂C++沦落到这个地步,也实在是够可怜的.
- SharePoint 2013的100个新功能之搜索(二)
一:名称建议 人员搜索中新的“名称建议”功能,微软引入了一种简单.直观的方式来根据名称找到用户.输入一个或多个字符,查看全部以其开头的名称,在所有的用户描述数据库都可用,在人员索引中也因此一样可用.该 ...
- VB.net数据库编程(03):一个SQLserver连接查询的简单样例
这个样例,因为在ADO.net入门已经专门学了,再次进行复习 一下. 主要掌握连接字串的情况. 过程就是: 1.引用System.Data.SqlClient.而Access中引用 的是System. ...
- QT使用scrollarea显示图片,完美解决方案
需求: 在界面上点击“显示图片”按钮,会调用scrollarea窗口显示图片,窗口大小能根据图片大小自动调整,但是最大为1024*768,图片过大就要有滚动条来显示 IDE环境: QT Creator ...
- 【开发手记一】老生常谈:简简单单配置ZED板开发环境
说明:整理之前项目博客,此系列之前发表于与非网 http://www.openhw.org/module/forum/thread-552476-1-1.html 在拿到开发板和配套教材之前,我们小组 ...
- 几本不错的CPU设计以及VLSI的书籍
1. Microprocessor Design Principales and Practrices with VHDL 特点:电路与VHDL一一对应,比较清楚,而且还用MAX+plus进行仿真 ...
- Android switch 中 case expressions must be constant expressions 错误
刚才导入android zxing 条码 的demo测试,发现出现如下错误 case expressions must be constant expressions 经检查,项目被设置成librar ...
- 【ASP.NET Web API教程】2.3 与实体框架一起使用Web API
原文:[ASP.NET Web API教程]2.3 与实体框架一起使用Web API 2.3 Using Web API with Entity Framework 2.3 与实体框架一起使用Web ...
- Jsp中使用数据库连接池.
原文 Jsp中使用数据库连接池. 1. 在tomcat服务器目录下面的conf中找到一个叫Context.xml的配置文件,在其中加入以下代码 <Resource name="jdbc ...