通过这道题对树形背包理解更深一步......

有几个地方需要注意:

1.本题数据结构为森林,需增加一个超根作为根节点,M+=1(后面解释)。

2.本题有拓扑序的限制,通过vector建成的一棵树中,必须父节点选择了之后才可以往下选择孩子节点。

3.在以v为根的子树中选择k个节点,k必然小等于v的子树大小,所以dfs过程中维护子树大小并进行优化,效率会有很大提升。

关键在于dp过程中如何保证第2点:

dp[u][j]表示在u为根的子树中选择j个点所得最大值,将边界条件设为dp[u][1]=val[u],这样就保证了在u为根的子树中选择1个点时只能是选择他自己,这样就能解决拓扑序的限制,我们的求解目标就是dp[0][M],注意这个M是加1过的,因为我们增加一个超根,我们只有在选择超根后才能往下选,所以M要加1,且超根是没有权值的,所以对最后答案也就没有影响。

如何理解树形背包:回想背包的特点是什么,枚举i物品时前i-1个已经求解,所以相当于是在原来的基础上在更新最优解(这也是大多数DP的特点),我们在处理u节点时,首先求解到一棵子树v1,通过v1更新了dp[u][ ],那么后面的v2,v3...也就基于前面的结果再次求解,最后能得到dp[u][ ]的最优解,代码类似于分组背包,还要注意倒推,因为每个节点只能被选1次。

 1 #include<cstdio>
2 #include<cstring>
3 #include<algorithm>
4 #include<vector>
5 using namespace std;
6 const int N=200+10;
7 int val[N],dp[N][N];
8 vector<int>E[N];
9
10 int dfs(int u,int M){//返回以u为根的子树大小
11 dp[u][1]=val[u];
12 int sizeu=1,sizev=0;
13 for(int i=0;i<E[u].size();i++){
14 int v=E[u][i];
15 sizev=dfs(v,M-1);
16 for(int j=M;j>=1;j--)//类似分组背包倒推
17 for(int k=1;k<=sizev&&k<j;k++)
18 dp[u][j]=max(dp[u][j],dp[v][k]+dp[u][j-k]);
19 sizeu+=sizev;
20 }
21 return sizeu;
22 }
23
24 int main(){
25 int N,M;
26 while(~scanf("%d%d",&N,&M),N+M){
27 for(int i=0;i<=N;i++) E[i].clear();
28 memset(dp,0,sizeof(dp));
29 M++;//增加超根后,M+1
30 val[0]=0;
31 int u;
32 for(int i=1;i<=N;i++){
33 scanf("%d%d",&u,&val[i]);
34 E[u].push_back(i);
35 }
36 dfs(0,M);
37 printf("%d\n",dp[0][M]);
38 }
39 return 0;
40 }

HDU1561 The more, The Better(树形背包)的更多相关文章

  1. hdu1561 The more, The Better 树形DP+分组背包

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561 思路: 典型的树形背包题目: 定义dp[i][j]表示以i为根节点,攻打j个城堡的获得的财宝的最 ...

  2. HDU1561 The more ,The better (树形背包Dp)

    ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物.但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先 ...

  3. poj2486Apple Tree[树形背包!!!]

    Apple Tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9989   Accepted: 3324 Descri ...

  4. cdoj 1136 邱老师玩游戏 树形背包

    邱老师玩游戏 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1136 Desc ...

  5. HDU 1011 树形背包(DP) Starship Troopers

    题目链接:  HDU 1011 树形背包(DP) Starship Troopers 题意:  地图中有一些房间, 每个房间有一定的bugs和得到brains的可能性值, 一个人带领m支军队从入口(房 ...

  6. poj 1155 TELE (树形背包dp)

    本文出自   http://blog.csdn.net/shuangde800 题目链接: poj-1155 题意 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构, ...

  7. bzoj 4813: [Cqoi2017]小Q的棋盘 [树形背包dp]

    4813: [Cqoi2017]小Q的棋盘 题意: 某poj弱化版?树形背包 据说还可以贪心... #include <iostream> #include <cstdio> ...

  8. [HAOI2015]树上染色(树形背包)

    有一棵点数为 N 的树,树边有边权.给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 . 将所有点染色后,你会获得黑点两两之间的距离加 ...

  9. Luogu 1273 有线电视网 - 树形背包

    Description 树形背包, 遍历到一个节点, 枚举它的每个子节点要选择多少个用户进行转移. Code #include<cstring> #include<cstdio> ...

随机推荐

  1. 主线程和创建多线程程序的第一种方式_创建Thread类的子类

    /** * 主线程:执行主方法的线程(main) * 单线程程序:在java程序中只有一个线程 * 执行从main方法开始,从上倒下依次执行 */ public class Demo01MainThr ...

  2. python在管道中执行命令

    简介 在实际开发中,可能在执行命令过程中,需要在命令的管道中输入相应命令后继续执行,因此需要在执行命令后在命令的管道中输入相应指令 方法一 直接使用communicate向管道传入所需指令,注意如果是 ...

  3. 珠联壁合地设天造|M1 Mac os(Apple Silicon)基于vscode(arm64)配置搭建Java开发环境(集成web框架Springboot)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_194 也许有人从未听说过Python,但是不会有人没听说过Java,它作为一个拥有悠久历史的老牌编程语言,常年雄踞TIOBE编程语 ...

  4. 达人专栏 | 还不会用 Apache Dolphinscheduler?大佬用时一个月写出的最全入门教程【三】

    作者 | 欧阳涛 招联金融大数据开发工程师 02 Master启动流程 2.10 WorkFlowExecutorThread 里执行 Submit StandByTask 方法 SubmitStan ...

  5. 完整实现-通过DelayQueue实现延时任务

    实现延时任务有很多的方法,网上关于延时任务的实现的文章已经不少了.比如:实现延时任务的10种方法等等.但是这些文章基本上都是将方法大概的列举一下,给出部分示例代码,对于有经验的老程序员可能一看就知道该 ...

  6. P4675 [BalticOI 2016 day1]Park (并查集)

    题面 在 Byteland 的首都,有一个以围墙包裹的矩形公园,其中以圆形表示游客和树. 公园里有四个入口,分别在四个角落( 1 , 2 , 3 , 4 1, 2, 3, 4 1,2,3,4 分别对应 ...

  7. PHP随机图片API

    相比上一个版本代码缩短了 此版本为图片专用 查看代码 <?php $img=file('img.txt');//txt文件 $url=array_rand($img);//imgtxt文档里面图 ...

  8. C#基础_枚举

    一.在学习枚举之前,首先来听听枚举的优点. 1.枚举能够使代码更加清晰,它允许使用描述性的名称表示整数值. 2.枚举使代码更易于维护,有助于确保给变量指定合法的.期望的值. 3.枚举使代码更易输入. ...

  9. 【java】学习路径23-拆箱与装箱

    拿Integer类型和int类型来举例子. 装箱,基本给引用.下面的代码相当于Integer i_test = Integer.valueOf("100"); 注意!过程是自动的. ...

  10. Linux上安装jdk 1.8

    1.下载jdk1.8 这里贴个oracle官网链接 https://www.oracle.com/java/technologies/downloads/  里面的jdk版本基本都有 2.将压缩包上传 ...