HDU1561 The more, The Better(树形背包)
通过这道题对树形背包理解更深一步......
有几个地方需要注意:
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(树形背包)的更多相关文章
- hdu1561 The more, The Better 树形DP+分组背包
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561 思路: 典型的树形背包题目: 定义dp[i][j]表示以i为根节点,攻打j个城堡的获得的财宝的最 ...
- HDU1561 The more ,The better (树形背包Dp)
ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物.但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先 ...
- poj2486Apple Tree[树形背包!!!]
Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9989 Accepted: 3324 Descri ...
- cdoj 1136 邱老师玩游戏 树形背包
邱老师玩游戏 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1136 Desc ...
- HDU 1011 树形背包(DP) Starship Troopers
题目链接: HDU 1011 树形背包(DP) Starship Troopers 题意: 地图中有一些房间, 每个房间有一定的bugs和得到brains的可能性值, 一个人带领m支军队从入口(房 ...
- poj 1155 TELE (树形背包dp)
本文出自 http://blog.csdn.net/shuangde800 题目链接: poj-1155 题意 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构, ...
- bzoj 4813: [Cqoi2017]小Q的棋盘 [树形背包dp]
4813: [Cqoi2017]小Q的棋盘 题意: 某poj弱化版?树形背包 据说还可以贪心... #include <iostream> #include <cstdio> ...
- [HAOI2015]树上染色(树形背包)
有一棵点数为 N 的树,树边有边权.给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 . 将所有点染色后,你会获得黑点两两之间的距离加 ...
- Luogu 1273 有线电视网 - 树形背包
Description 树形背包, 遍历到一个节点, 枚举它的每个子节点要选择多少个用户进行转移. Code #include<cstring> #include<cstdio> ...
随机推荐
- Cow Picnic S
题目描述: K(1≤K≤100)只奶牛分散在N(1≤N≤1000)个牧场.现在她们要集中起来进餐.牧场之间有M(1≤M≤10000)条有向路连接,而且不存在起点和终点相同的有向路.她们进餐的地点必须是 ...
- 20220722-Java可变参数
Java可变参数总结 来源:B站韩顺平老师的Java入门教学 代码示例如下: public void f(String str,int... nums){ 方法体; } 代码示例如下: public ...
- Fibonacci Nim
目录 题意 题解 相关 Ref 题意 [COCI2010-2011#4] HRPA 取石子,但是: 先手第一次可取任意多个石子 此外每次可取的石子的个数,至少为 \(1\) ,至多为上一轮对方所取个数 ...
- PHP小知识收集
PEAR 是"PHP Extension and Application Repository"的缩写,即PHP扩展和应用仓库. PECL 是"PHP Extension ...
- WPF 截图控件之文字(七)「仿微信」
前言 接着上周写的截图控件继续更新添加 文字. 1.WPF实现截屏「仿微信」 2.WPF 实现截屏控件之移动(二)「仿微信」 3.WPF 截图控件之伸缩(三) 「仿微信」 4.WPF 截图控件之绘制方 ...
- 记一次 .NET 某工控自动化控制系统 卡死分析
一:背景 1. 讲故事 前段时间遇到了好几起关于窗体程序的 进程加载锁 引发的 程序卡死 和 线程暴涨 问题,这种 dump 分析难度较大,主要涉及到 Windows操作系统 和 C++ 的基础知识, ...
- React报错之Objects are not valid as a React child
正文从这开始~ 总览 当我们尝试在JSX代码中,直接渲染对象或者数组时,会产生"Objects are not valid as a React child"错误.为了解决该错误, ...
- 技术分享 | 为什么MGR一致性模式不推荐AFTER
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 1.引子 2.AFTER 的写一致性 3.AFTER 的读一致性 4.AFTER 执行流程 5.BEFORE 执行流程 6 ...
- PyCharm 2022.2 发布了,支持最新 Python 3.11 和 PyScript 框架!
来源:Jet Brains官网:翻译:Python猫 原文:https://blog.jetbrains.com/pycharm/2022/07/2022-2 通常而言,使用新潮的或者快速发展的技术, ...
- (防坑)Alphafold 非docker 安装指南
本指南适用于Linux系统.Alphafold官方也强调尽量使用Linux系统!官方提供了docker版安装步骤. Alphafold简介: 强大的蛋白质结构预测. 开源地址:https://gith ...