题意是说在一个洞穴中有许多房间,每个房间中有一些虫子和大脑,这些房间之间用隧道相连形成一棵树,士兵们杀虫子的能力有限,也可以直接杀死虫子而不消耗士兵战斗力,但这样就无法得到房间中的大脑,士兵们不能走回头路,问给定士兵数量时能得到的大脑最大值。

在树上进行动态规划,对于每个节点来说,选择了它,就要损失士兵战斗力,不选择它,就可以将这些省下来的士兵战斗力用在后面的房间中,后面的房间将最优选择传递到当前位置,以此来判断从而得到最优解。
转移方程:dp[ i ][ j ] = max(dp[ i ][ j ], dp[ i ][ j-k ]+dp[ son(i) ][ k ])

dp[ i ][ j ] 表示以节点 i 为根节点时消耗 j 个士兵所能得到的最大大脑数。

开始的时候直接将每个士兵按战斗力分成每个战斗力为 1 的士兵,也就是说将士兵数量乘以 20 ,企图直接可以用士兵数和虫子数进行加减运算,但是这样很明显是错误的,因为如果一个房间中的虫子数模 20 不为零,也就是说并不能完全发挥一个士兵的战斗力时,要取到这个房间的大脑,就需要再消耗一个士兵,即士兵战斗力并不等于士兵手中的子弹数(这样说好像更复杂了,意思就是每个士兵不一定会杀满 20 只虫子)。

还有一点就是士兵数是可以为零的,但是必须要有人进去才能得到大脑,无论里面是否有虫子。

代码如下:

 #include <bits/stdc++.h>
using namespace std;
const int MAXN = ;
int N,M;
struct Node
{
int enemy,aim;
}node[MAXN];//存储所有节点上的信息
int dp[MAXN][MAXN];//dp[i][j]表示根节点为 i 时,用掉 j 个士兵获得的最大值
int mp[MAXN][MAXN];//存图,mp[i][0]表示与节点 i 相连的边的数目
bool vis[MAXN];//记录节点的访问情况
void dfs(int root)
{
vis[root] = true;
int num = (node[root].enemy+)/;//获得当前节点需要的士兵数目
for(int i = num; i <= M; i++) dp[root][i] = node[root].aim;
for(int i = ; i <= mp[root][]; i++)//开始遍历与根节点相连的子节点
{
int u = mp[root][i];
if(vis[u]) continue;
dfs(u);
for(int j = M; j >= num; j--)
for(int k = ; j+k <= M; k++)
if(dp[u][k])//判断是否应该取当前节点 u
dp[root][j+k] = max(dp[root][j+k],dp[root][j]+dp[u][k]);
}
}
int main()
{
int a,b;
while(scanf("%d%d",&N,&M))
{
if(N == - && M == -) break;
memset(vis,,sizeof(vis));
memset(dp,,sizeof(dp));
memset(mp,,sizeof(mp));
for(int i = ; i <= N; i++)
scanf("%d%d",&node[i].enemy,&node[i].aim);
for(int i = ; i < N; i++)
{
scanf("%d%d",&a,&b);
mp[a][]++;
mp[b][]++;
mp[a][mp[a][]] = b;
mp[b][mp[b][]] = a;
}
if(M==) puts("");//有可能己方没有士兵,但要求至少要有人进去
else
{
dfs();
printf("%d\n",dp[][M]);
} }
return ;
}

这道题还是借鉴了很多大佬的博客才做出来的,感谢这些大佬的分享 ^_^

HDU 1011(星河战队 树形DP)的更多相关文章

  1. HDU 1011 Starship Troopers 树形DP 有坑点

    本来是一道很水的树形DP题 设dp[i][j]表示,带着j个人去攻打以节点i为根的子树的最大收益 结果wa了一整晚 原因: 坑点1: 即使这个节点里面没有守卫,你如果想获得这个节点的收益,你还是必须派 ...

  2. [HDU 1011] Starship Troopers (树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 dp[u][i]为以u为根节点的,花了不超过i元钱能够得到的最大价值 因为题目里说要访问子节点必 ...

  3. hdu 1011 Starship Troopers(树形DP入门)

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

  4. hdu 1520Anniversary party(简单树形dp)

    Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  5. POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题

    一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加. 要求: 1.为了聚会有趣,若邀请了一个职员,则该职员的直接上级(即父节点)和直接下级(即儿子节点) ...

  6. hdu 5452 Minimum Cut 树形dp

    Minimum Cut Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=54 ...

  7. HDU 1520 Anniversary party [树形DP]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题目大意:给出n个带权点,他们的关系可以构成一棵树,问从中选出若干个不相邻的点可能得到的最大值为 ...

  8. Install Air Conditioning HDU - 4756(最小生成树+树形dp)

    Install Air Conditioning HDU - 4756 题意是要让n-1间宿舍和发电站相连 也就是连通嘛 最小生成树板子一套 但是还有个限制条件 就是其中有两个宿舍是不能连着的 要求所 ...

  9. HDU 3586 二分答案+树形DP判定

    HDU 3586 『Link』HDU 3586 『Type』二分答案+树形DP判定 ✡Problem: 给定n个敌方据点,1为司令部,其他点各有一条边相连构成一棵树,每条边都有一个权值cost表示破坏 ...

随机推荐

  1. bzoj 1854: [Scoi2010]游戏 (并查集||二分图最大匹配)

    链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1854 写法1: 二分图最大匹配 思路:  将武器的属性对武器编号建边,因为只有10000种 ...

  2. 「POJ-3608」Bridge Across Islands (旋转卡壳--求两凸包距离)

    题目链接 POJ-3608 Bridge Across Islands 题意 依次按逆时针方向给出凸包,在两个凸包小岛之间造桥,求最小距离. 题解 旋转卡壳的应用之一:求两凸包的最近距离. 找到凸包 ...

  3. Luogu P4643 【模板】动态dp(矩阵乘法,线段树,树链剖分)

    题面 给定一棵 \(n\) 个点的树,点带点权. 有 \(m\) 次操作,每次操作给定 \(x,y\) ,表示修改点 \(x\) 的权值为 \(y\) . 你需要在每次操作之后求出这棵树的最大权独立集 ...

  4. 转----ui输入测试数据

    jin'tHackChecker黑测工作室 - 专注于软件安全测试技术研究!(www.AutomationQA.com)常用安全测试用例 建立整体的威胁模型,测试溢出漏洞.信息泄漏.错误处理.SQL ...

  5. docker-compose.yml(3)

    ELK:version: '2' services: elasticsearch: build: context: elasticsearch/ volumes: - ./elasticsearch/ ...

  6. 生产者&消费者.py

    1.最简单的 --生产者消费者 send.py# !/usr/bin/env python3.5# -*- coding:utf-8 -*-# __author__ == 'LuoTianShuai' ...

  7. [ZJOI2005]九数码游戏(BFS+hash)

    Solution 这题的话直接上BFS就可以了,因为要输出方案,所以我们要开一个pre数组记录前驱,最后输出就可以了. 对于状态的记录,一般都用哈希来存,但因为这道题比较特殊,它是一个排列,所以我们可 ...

  8. centos7/rhel7下安装redis4.0集群

    相关介绍:Redis从3.0版本开始支持集群! 集群一般由多个节点组成,节点数量至少6个才能保证组成完整高可用的集群. 每个节点需要开启配置文件中的cluster-enabled yes,让Redis ...

  9. Nginx环境的搭建

    源码安装 不同发行版使用的安装程序都不同,所以官方提供了源代码,我们需要将原代码编译后再安装. 源程序使用C语言开发,所以需要安装C语言的编译环境. 安装Nginx环境和第三方支持库 yum inst ...

  10. Vue+koa2开发一款全栈小程序(1.课程介绍+2.ES6入门)

    1.课程介绍 1.课程概述 1.做什么? Vue+koa2开发一款全栈小程序 2.哪些功能? 个人中心.图书列表.图书详情.图书评论.个人评论列表 3.技术栈 小程序.Vue.js.koa2.koa- ...