题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1011

题意:打洞洞收集脑子,你带领一个军队,洞洞互联成一棵树,每个洞中有一些bug,要全部杀死这些虫子才可以取得这个洞中的脑子,只有杀死当前节点的bug才可以继续走下去,且如果有0个bug你仍要派遣一个士兵在这里,只不过可以士兵不停留。

题解:很清晰明了的树形dp了,但是某些人说过写题解就要写细致。。。所以我们还是来详细讲解一下树形dp吧。。。

树形dp:

这是一个很裸的树形dp,和一般的dp不同的是,树形dp有了分支,所以要考虑子孩子和父亲孩子之间的关系。及父亲的最大值来源于其自孩子反馈给他的结果。

我们考虑dp[i][j]表示当前以第i个节点为编号的已经考虑的子树种耗费j个士兵的情况可以获得的最大收益

(分析的时候自顶向下,实现自底向上,这也是dfs的思想,树形dp一般都是在dfs过程中实现的)

考虑如果我们知道了当前节点所有子孩子的dp值,即我们知道了给当前已经考虑的孩子分着多少个士兵可以获得他和子孩子的最大收益,那么再考虑他的下一个子孩子的时候

就可以在此基础上枚举将士兵挨个分给新的子孩子的时候的最大收益,最后我们考虑完所有的子孩子,并把所有士兵都分下去就是结果了。

给出dp方程: dp[i][j] = max(dp[i][j],dp[i][j-k]+dp[son][k]);

画个图来帮助理解一下:

是不是很简单腻~图上没有说一些细节,和一般的dp一样,要考虑之前计算的点是否会被覆盖问题,在枚举j时候要从m向前搜索,因为如果从后往前,计算后面dp[i][j]的时候用到dp[i][j-k]已经被修改过了。还有一个细节就是如何保证当前节点有没有bug都分给一个士兵,这个很简单,只要k从1开始循环就可以了,即保证了无论怎样都给这个节点一个士兵。

代码:

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = ;
int n,m;
int cost[N],value[N];
int vis[N];
struct Edge{
int to;
int next;
}edge[N*N];
int Ecnt;
int head[N];
int dp[N][N];
void init()
{
for(int i = ; i <= n; i++ ){
head[i] = -;
vis[i] = ;
}
Ecnt = ;
memset(dp,,sizeof(dp));
}
void add(int from, int to)
{
edge[Ecnt].to = to;
edge[Ecnt].next = head[from];
head[from] = Ecnt++; edge[Ecnt].to = from;
edge[Ecnt].next = head[to];
head[to] = Ecnt++;
}
void dfs(int id)
{
vis[id] = ;
int tm;
if(m<cost[id]) return;
for(int j = cost[id]; j <= m; j++) dp[id][j] = value[id];
for(int d = head[id]; d!=-; d = edge[d].next)
{
tm = edge[d].to;
if(!vis[tm]){
dfs(tm);
for(int j = m; j >= cost[id]; j--){
for(int k = ; k <= (j-cost[id]); k++){
if(j-k>=cost[id])
dp[id][j] = max(dp[id][j],dp[id][j-k]+dp[tm][k]);
}
}
}
}
return;
}
int main()
{
int tm,tm1,tm2;
while(~scanf("%d%d",&n,&m))
{
if(n==-&&m==-) return ;
for(int i = ; i <= n; i++)
{
scanf("%d %d",&tm,&value[i]);
cost[i] = (tm+)/;
}
init();
for(int i = ; i < n; i++)
{
scanf("%d %d",&tm1,&tm2);
add(tm1,tm2);
}
vis[] = ;
if(m==){printf("0\n");continue;}
dfs();
printf("%d\n",dp[][m]);
}
return ;
}

hdu_1011(Starship Troopers) 树形dp的更多相关文章

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

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

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

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

  3. hdu1011 Starship Troopers 树形DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 思路:很明显的树形背包 定义dp[root][m]表示以root为根,派m个士兵的最优解,那么d ...

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

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

  5. hdu 1011 Starship Troopers 树形背包dp

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

  6. hdu 1011 Starship Troopers(树形背包)

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

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

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

  8. hdu_1011_Starship Troopers(树形DP)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 题意:有N个房间,房间的连通性为树形的,就是说你要占领子结点,必须要先占领 父结点,每个房间有第 ...

  9. HDU 1011 Starship Troopers (树dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 题意: 题目大意是有n个房间组成一棵树,你有m个士兵,从1号房间开始让士兵向相邻的房间出发,每个 ...

随机推荐

  1. 点击button1弹出form2,并在form2中点击button2来调用form1的方法

    链接地址:http://www.sufeinet.com/thread-1273-1-1.html   1.     private void button1_Click(object sender, ...

  2. PE格式第三讲扩展,VA,RVA,FA(RAW),模块地址的概念

    PE格式第三讲扩展,VA,RVA,FA的概念 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶VA概念 VA (vi ...

  3. hbase rest api接口链接管理【golang语言版】

    # go-hbase-resthbase rest api接口链接管理[golang语言版]关于hbase的rest接口的详细信息可以到官网查看[http://hbase.apache.org/boo ...

  4. Find the Maximum sum

    Given an array of n elements.Find the maximum sum when the array elements will be arranged in such w ...

  5. 查看内存和cpu

    top: 主要参数 d:指定更新的间隔,以秒计算. q:没有任何延迟的更新.如果使用者有超级用户,则top命令将会以最高的优先序执行. c:显示进程完整的路径与名称. S:累积模式,会将己完成或消失的 ...

  6. Error in library(DESeq2) : 不存在叫‘DESeq2’这个名字的程辑包

    Error in read.dcf(file.path(pkgname, "DESCRIPTION"), c("Package", "Type&quo ...

  7. JavaScript的DOM编程--03--读写属性节点

    读写属性节点: 1)可以直接通过 cityNode.id 这样的方式来获取和设置属性节点的值 2)通过元素节点的 getAttributeNode 方法来获取属性节点, 然后在通过 nodeValue ...

  8. 使用Word进行文档修订版本的比较

    项目经理在实际的工作过程中,比如要写文档方案,就需要对文档的修订版本进行管理和控制.在以前的工作中,笔者使用的是UltraEdit这个软件工具中的Ultra Compare这个子工具来进行的文档版本的 ...

  9. php 运行的四种模式

    1)cgi 通用网关接口(Common Gateway Interface)) CGI即通用网关接口(Common Gateway Interface),它是一段程序, 通俗的讲CGI就象是一座桥,把 ...

  10. 使用HTML语言和CSS开发商业站点

    第一章 预习笔记 单词: head:前进 title:标题 meta:超过 body:身体.尸体 W3C:全球最大的中文Web技术教程 strong:强烈的 target:目标,对象 href:水平参 ...