HDU 1011 Starship Troopers星河战队(树形dp)
题意
有n个洞穴编号为1~n,洞穴间有通道,形成了一个n-1条边的树, 洞穴的入口即根节点是1。
每个洞穴有x只bugs,并有价值y的金子,全部消灭完一个洞穴的虫子,就可以获得这个洞穴的y个金子.
现在要派m个战士去找金子,从入口进入。每次只有消灭完当前洞穴的所有虫子,才可以选择进入下一个洞穴。
一个战士可以消灭20只虫子,如果要杀死x只虫子,那么要x/20向上取整即(x+19)/20个战士。
如果要获得某个洞穴的金子,必须留下足够杀死所有虫子的战士数量, 即(x+19)/20个战士,然后这些留下战士就不能再去其它洞穴
其他战士可以继续走去其它洞穴,可以选择分组去不同的洞穴。
战士只能往洞穴深处走,不能走回头路。
问最多能获得多少金子?
思路:
基础的树形DP。
要特别注意的是,如果某个节点的bug数为0,而金子不为0,那么仍然需要派1个人以上去捡,而不是花0个士兵就能获得该点的金子。
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=110; 4 vector<int> vect[N]; 5 int bug[N], num[N], dp[N][N], n, m; 6 7 void DFS(int t,int far,int peo) 8 { 9 int need=(bug[t]+19)/20; 10 if(peo<need || peo==0) return ; 11 12 for(int i=need; i<=peo; i++) dp[t][i]=num[t]; //若有士兵i>=need个,那么起码拿到本节点的金子 13 for(int i=0; i<vect[t].size(); i++) 14 { 15 int to=vect[t][i]; 16 if(to^far) 17 { 18 DFS(to, t, peo-need); 19 for(int j=peo; j>need; j--) //到达本节点可能的人数。 20 for(int k=1; k<=j-need; k++) //给孩子to分配k个士兵。 21 dp[t][j]=max(dp[t][j],dp[t][j-k]+dp[to][k]); 22 } 23 } 24 } 25 26 27 int main() 28 { 29 freopen("input.txt","r",stdin); 30 int u,v; 31 while(scanf("%d%d",&n,&m), n+m>0) 32 { 33 for(int i=0; i<=n; i++) vect[i].clear(); 34 memset(dp,0,sizeof(dp)); 35 36 for(int i=1; i<=n; i++) //房间里的bug数、金子 37 scanf("%d%d",&bug[i],&num[i]); 38 for(int i=1; i<n; i++) //连通情况 39 { 40 scanf("%d%d",&u,&v); 41 vect[u].push_back(v); 42 vect[v].push_back(u); 43 } 44 DFS(1, -1, m); 45 printf("%d\n", dp[1][m]); 46 } 47 return 0; 48 }
AC代码
转载于:https://www.cnblogs.com/xcw0754/p/4241459.html
HDU 1011 Starship Troopers星河战队(树形dp)相关推荐
- 树形DP——HDU 1011 Starship Troopers
HDU 1011 Starship Troopers 题目 http://acm.hdu.edu.cn/showproblem.php?pid=1011 作为星河战队的领导者,你被派去摧毁这些虫子的基 ...
- HDU 1011 Starship Troopers 树形+背包dp
http://acm.hdu.edu.cn/showproblem.php?pid=1011 题意:每个节点有两个值bug和brain,当清扫该节点的所有bug时就得到brain值,只有当父节点被 ...
- HDU 1011(星河战队 树形DP)
题意是说在一个洞穴中有许多房间,每个房间中有一些虫子和大脑,这些房间之间用隧道相连形成一棵树,士兵们杀虫子的能力有限,也可以直接杀死虫子而不消耗士兵战斗力,但这样就无法得到房间中的大脑,士兵们不能走回 ...
- hdu 1011 Starship Troopers (树形背包dp)
本文出自 http://blog.csdn.net/shuangde800 题目链接 : hdu-1011 题意 有n个洞穴编号为1-n,洞穴间有通道,形成了一个n-1条边的树, 洞穴的入口即根节 ...
- hdu 1561 The more, The Better 树形dp
http://acm.hdu.edu.cn/showproblem.php?pid=1561 做树形dp比较小. 先上网学习下,总结下套路. dp[i][j]表示在第i个节点,有j个名额选的时候的最大 ...
- HDU - 6769-In Search of Gold-二分+树形dp
https://vjudge.net/problem/HDU-6769 题目大意:给你n个点,有n-1条边,每条边有a,b两个权值,给你一个k,恰好有k条边的权值取a,其余取b的时候,树的直径的最小值 ...
- 【HDU - 5452】Minimum Cut(树形dp 或 最近公共祖先lca+树上差分,转化tricks,思维)
题干: Given a simple unweighted graph GG (an undirected graph containing no loops nor multiple edges) ...
- 【HDU - 1520】Anniversary party (树形dp)
题干: There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. Th ...
- hdu 4799 LIKE vs CANDLE(树形dp)
题目链接:hdu 4799 LIKE vs CANDLE 解题思路 dp[i][0]表示第i个节点不翻转的最优解,dp[i][1]表示翻转的最优解,每个位置翻转的代价到其父亲节点的位置再计算. 代码 ...
最新文章
- 一文读懂如何通过设计模式学习创建对象?
- Golang的interface实践
- 极虎病毒创造四个“之最”
- java多线程阻塞队列_阻塞队列和多线程消费者,如何知道何时停止
- 获取input相同名字的元素的值
- 岗位多多,招聘 23人 | 中国农业科学院深圳农业基因组研究所诚聘博士后和科研人员...
- 汇编代码调用main和分配内存
- 第一次带姐姐和弟弟去看海
- Android MeasureSpec解析
- 支持全球科研抗疫,艾柏森成功研发Omicron变异株重组蛋白
- 利用Python绘制三维的规则体(3维柱体、立方体和旋转棱柱)
- Java常用的集成开发工具Eclipse和IDEA
- 唯美首页纯静态html引导页
- JS高级程序设计读书笔记(第五章 引用变量)
- 《全国青少年软件编程等级考试》2021年3月C语言一级真题(含答案)
- 一只喵的西行记-9 喵林英雄虹猫梦
- DD-路径图、MM-路径图的定义与区别联系
- 区块链技术的应用在数字藏品上的体现
- Ubuntu下使用gcc和makefile编写c语言程序
- GitHub疯狂转发!阿里巴巴彩版java性能调优实战,终于到手了!文末福利