树形DP——HDU 1011 Starship Troopers
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相关推荐
- HDU 1011 Starship Troopers星河战队(树形dp)
题意 有n个洞穴编号为1-n,洞穴间有通道,形成了一个n-1条边的树, 洞穴的入口即根节点是1. 每个洞穴有x只bugs,并有价值y的金子,全部消灭完一个洞穴的虫子,就可以获得这个洞穴的y个金子. 现 ...
- HDU 1011 Starship Troopers 树形+背包dp
http://acm.hdu.edu.cn/showproblem.php?pid=1011 题意:每个节点有两个值bug和brain,当清扫该节点的所有bug时就得到brain值,只有当父节点被 ...
- hdu 1011 Starship Troopers (树形背包dp)
本文出自 http://blog.csdn.net/shuangde800 题目链接 : hdu-1011 题意 有n个洞穴编号为1-n,洞穴间有通道,形成了一个n-1条边的树, 洞穴的入口即根节 ...
- fwt优化+树形DP HDU 5909
1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...
- HDU Starship Troopers (树形DP)
Starship Troopers Time Limit : 10000/5000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) ...
- hdu 1520 Anniversary party(第一道树形dp)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Time Limit: 2000/1000 MS (Java ...
- HDU 2196 Computer 树形DP经典题
链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...
- hdu 5909 Tree Cutting——点分治(树形DP转为序列DP)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5909 点分治的话,每次要做一次树形DP:但时间应该是 siz*m2 的.可以用 FWT 变成 siz*ml ...
- HDU 1520 Anniversary party(树形dp)
HDU 1520 Anniversary party(树形dp) 树形dp第一题!!! 题意很清晰,思路也很明确.很容易找到根节点,即最大的boss,通过根节点向下dp. 状态转移方程: int to ...
最新文章
- 速览!CVPR 2020 最新论文
- 新书上市 | 人类程序员,你能不能比三体人更懂量子纠缠?
- linux推出超级用户_Linux 系统的进入与退出
- 部署LAMP-mysql 安装
- HD2500显卡驱动linux,Intel发布HD Graphics 2500/4000显卡Win10驱动下载
- 终于来了!Python 编辑神器 Jupyter ,推出首款官方可视化 Debug 工具!
- 2如何识别操作系统_扫描车牌识别车牌号的功能sdk
- mv命令移动文件到指定目录
- Tornado web开发之简单文件上传
- 基于JAVA+SpringMVC+Mybatis+MYSQL的医院预约挂号系统
- 【数字信号处理】基于matlab数字信号离散序列短时傅里叶变换【含Matlab源码 1545期】
- 电脑怎么重装系统后显示器没有信号了
- 图解密码学密钥的分配方式
- 计算机营销专业毕业生自我评价,市场营销专业毕业生自我评价
- jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)
- 一个足球队员的不屈抗争·《晚唱·贾平凹》
- 25 - 线程池和指令系统
- 淘口令卡首屏直通车卡首屏关键词刷单技术分享
- wordpress开启全站https
- 数据库(mysql)基本概念