HDU 1011 Starship Troopers

题目

http://acm.hdu.edu.cn/showproblem.php?pid=1011
作为星河战队的领导者,你被派去摧毁这些虫子的基地。

基地为一个个房间连成的树形结构,每个房间都被一些虫子占据,对应一定的大脑(分数)在房间里。为了尽快完成战斗,你不想等到部队人员清理房间后再前进到下一个房间,而是你必须在每个房间留下一些士兵来对抗里面的所有虫子。一个星舰士兵可以对抗20个虫子。由于你没有足够的士兵,你只能占用一些房间,让神经气体完成其余的工作(无法获得大脑)。计算最大所有可获得大脑的总和。

输入输出

输入:
N(房间个数)M(士兵个数)
N行,每行两个数,bugs[i](房间虫子数目)brain(房间大脑数目)
N-1行,每行两个数,room1 room2(room1和room2相连)
多组数据,-1,-1结束
输出:
最大获得大脑总和
多组数据

思路

dp[i][j]:第i个节点用去j个士兵获得的最大大脑数目
状态转移公式:dp[node][j]=max(dp[node][j],dp[node_son][l]+dp[node][j-l]);
树形DP:dfs

坑~

1.士兵个数M=0时,即使bugs=0,brains!=0,结果仍未0。
2.即使bugs=0不需要士兵消灭虫子也需要有士兵走过改路线。可设置叶子结点bugs=0为bugs=1。
3.两个房间连接的输入不一定是从父节点到子节点的,即需要存入无向图然后设置标志位实现树形的遍历。
4.见题目注释。

#pragma comment(linker,"/STACK:102400000,102400000")
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<iomanip>
#include<algorithm>
#include<numeric>
#include<functional>
#include<memory>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<vector>
#include<fstream>
#define min(a,b) (a)<(b)?(a):(b)
#define max(a,b) (a)>(b)?(a):(b)
#define lc(x) (x<<1)
#define rc(x) (x<<1|1)
const double pi=acos(-1.0);
const int INF=0x3f3f3f3f;
const int MAX=0x7fffffff;
const long long LINF=0x3f3f3f3f3f3f3f3f;
const long long LMAX=0x7fffffffffffffff;
const double eps=1e-9;
const int Mod=100007;
const int Max=10000005;
using namespace std;
int N,M;
int bugs[102],brains[102];
int a[102][102];
int dp[102][102];
bool f[102];
vector<int> v[102];void dfs(int node){f[node]=1; int node_min;node_min=(bugs[node]+19)/20;for(int i=node_min;i<=M;++i){dp[node][i]=brains[node];}int son_nums,node_son,node_son_min;son_nums=v[node].size();for(int i=0;i<son_nums;++i){node_son=v[node][i];if(f[node_son]==0){dfs(node_son);//for(int j=node_min;j<=M;++j){//不能从小到大,以为j大值有小值更新for(int j=M;j>=node_min;--j){//node_son_min=(bugs[node_son]+19)/20;//for(int l=node_son_min;j-l>=node_min;++l){//需要从1开始,以为node节点可以不取for(int l=1;j-l>=node_min;++l){dp[node][j]=max(dp[node][j],dp[node_son][l]+dp[node][j-l]);}}    }}
}int main() {freopen("data.in","r",stdin);cin.sync_with_stdio(false);cout.sync_with_stdio(false);while((cin>>N>>M)&&N!=-1&&M!=-1){for(int i=1;i<=N;++i){//initv[i].clear();}memset(dp,0,sizeof(dp));memset(f,0,sizeof(f));for(int i=1;i<=N;++i){//readcin>>bugs[i]>>brains[i];}int room1,room2;for(int i=0;i<N-1;++i){cin>>room1>>room2;v[room1].push_back(room2);v[room2].push_back(room1);}for(int i=1;i<=N;++i){//if(v[i].size()==1&&i!=1&&bugs[i]==0){//树形结构只有1--2时,1的size也是1 bugs[i]=1;}}if(M==0){//doitcout<<0<<endl;}else{ dfs(1);cout<<dp[1][M]<<endl;}}fclose(stdin);return 0;
}

树形DP——HDU 1011 Starship Troopers相关推荐

  1. HDU 1011 Starship Troopers星河战队(树形dp)

    题意 有n个洞穴编号为1-n,洞穴间有通道,形成了一个n-1条边的树, 洞穴的入口即根节点是1. 每个洞穴有x只bugs,并有价值y的金子,全部消灭完一个洞穴的虫子,就可以获得这个洞穴的y个金子. 现 ...

  2. HDU 1011 Starship Troopers 树形+背包dp

    http://acm.hdu.edu.cn/showproblem.php?pid=1011   题意:每个节点有两个值bug和brain,当清扫该节点的所有bug时就得到brain值,只有当父节点被 ...

  3. hdu 1011 Starship Troopers (树形背包dp)

    本文出自   http://blog.csdn.net/shuangde800 题目链接 : hdu-1011 题意 有n个洞穴编号为1-n,洞穴间有通道,形成了一个n-1条边的树, 洞穴的入口即根节 ...

  4. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

  5. HDU Starship Troopers (树形DP)

    Starship Troopers Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) ...

  6. hdu 1520 Anniversary party(第一道树形dp)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Time Limit: 2000/1000 MS (Java ...

  7. HDU 2196 Computer 树形DP经典题

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...

  8. hdu 5909 Tree Cutting——点分治(树形DP转为序列DP)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5909 点分治的话,每次要做一次树形DP:但时间应该是 siz*m2 的.可以用 FWT 变成 siz*ml ...

  9. HDU 1520 Anniversary party(树形dp)

    HDU 1520 Anniversary party(树形dp) 树形dp第一题!!! 题意很清晰,思路也很明确.很容易找到根节点,即最大的boss,通过根节点向下dp. 状态转移方程: int to ...

最新文章

  1. 速览!CVPR 2020 最新论文
  2. 新书上市 | 人类程序员,你能不能比三体人更懂量子纠缠?
  3. linux推出超级用户_Linux 系统的进入与退出
  4. 部署LAMP-mysql 安装
  5. HD2500显卡驱动linux,Intel发布HD Graphics 2500/4000显卡Win10驱动下载
  6. 终于来了!Python 编辑神器 Jupyter ,推出首款官方可视化 Debug 工具!
  7. 2如何识别操作系统_扫描车牌识别车牌号的功能sdk
  8. mv命令移动文件到指定目录
  9. Tornado web开发之简单文件上传
  10. 基于JAVA+SpringMVC+Mybatis+MYSQL的医院预约挂号系统
  11. 【数字信号处理】基于matlab数字信号离散序列短时傅里叶变换【含Matlab源码 1545期】
  12. 电脑怎么重装系统后显示器没有信号了
  13. 图解密码学密钥的分配方式
  14. 计算机营销专业毕业生自我评价,市场营销专业毕业生自我评价
  15. jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)
  16. 一个足球队员的不屈抗争·《晚唱·贾平凹》
  17. 25 - 线程池和指令系统
  18. 淘口令卡首屏直通车卡首屏关键词刷单技术分享
  19. wordpress开启全站https
  20. 数据库(mysql)基本概念

热门文章

  1. 远程连接超过最大用户数的解决办法
  2. 关于百度编辑器设置默认行间距段间距
  3. auc是怎么计算的?
  4. 进阶篇|游戏代理工作室如何更好的创收?
  5. python中global的意思_python中global是什么意思?
  6. 【组合数学】拉姆齐问题以及拉姆齐数(图文详解)
  7. 对象难找,教你几招创建对象的方式
  8. 《HR黑话大全》:那些残忍的潜台词
  9. 在Java中,使用HttpUtils实现发送HTTP请求
  10. 攀比之于人生是一种怎样的存在