
树形DP
文章平均质量分 79
maze_illusion
这个作者很懒,什么都没留下…
展开
-
POJ 1947 树形DP
题目链接题意:求树中最少的去除边数能够分割出一个节点数为k的子树。思路:定义dp[i][j]表示以i为根的子树分割出一个节点数为j的子树的最少去除边数。状态转移:dp[u][j] = min ( dp[u][j] , dp[u][j-k]+dp[v][k]-1 );u:当前树树根v:子树树根j: 当前树节点数k:子树节点数答案要+1,是因为初始定义dp[u][1]时统一使用了indeg[u]-1。...原创 2018-06-21 14:40:01 · 160 阅读 · 0 评论 -
POJ 2378 树形DP
题目链接题意:给一颗树,可以删除树中一点,求删除那些点后最大的联通块内点数小于等于总点数一半,输出这些点。思路:定义dp[u]表示将u删去后最大联通块的点数:dp[u] = max ( n-sizes[u] , max( son[u] ) ),将dp[u]<=n的点输出。C++代码:#include<map>#include<set>#include<sta...原创 2018-06-09 18:35:38 · 221 阅读 · 0 评论 -
POJ 3107 树形DP
题目链接题意:给一颗树,求删除一个点后剩余联通块中点数最多的块点数最小的删除点,若有多解全部输出。思路:当删除某点时剩余联通块将包含以下情况:整颗树除以此点为根的块外的块以及此点下面的子树块。定义dp[u]为移除点u后的答案:dp[u] = max( n-sizes[u] , max( son[u] ) )C++代码:#include<map>#include<set>...原创 2018-06-09 18:25:54 · 192 阅读 · 0 评论 -
codeforces 219D 树形DP
题目链接题意:给一颗树但边是单向边,求至少旋转多少条单向边的方向,可以使得树有点可以到达树上任意一点,若有多个答案全部输出。 思路:两边dfs求解:第一遍:定义dp数组:dp[u]表示从上到下以u为根,至少需要旋转多少条边的方向使得根u可以到达子树中任意一点。状态转移方程:dp[u] += dp[v]+w第二遍:定义dp数组:dp[u]表示以u为根,至少需要旋转多少条边的方向使得根u可以到达子树中...原创 2018-06-09 16:49:16 · 260 阅读 · 0 评论 -
HDU 2196 树形DP
题目链接题意:给定一颗树,求树上各点的最大可到距离。思路:定义dp数组和son数组:dp[u][0]:表示从u向下可以到达的最大距离dp[u][1]:表示从u向下可以到达的次大距离dp[u][2]:表示从u向上先到父结点后再可以到达的最大距离son[u]:表示从u向下可以到达的最大距离经过的子结点dp[u][0]和dp[u][1]进行一遍dfs1即可求得dp[u][2]:需要分两种情况:情况1:v...原创 2018-06-09 16:07:16 · 236 阅读 · 1 评论 -
HDU 1520 树形DP
题目链接题意:给定一颗树,树上每一个点都有一个权值,要求父结点与其子结点不能同时选择,求最终可以得到的最大权值。思路:定义dp数组:dp[u][0]表示结点u不选的最大结果,dp[u][1]表示结点u选择的最大结果。状态转移方程:(u表示父结点,v表示子结点)dp[u][0] += max ( dp[v][0] , dp[v][1] ) dp[u][1] += dp[v][0]C++代码:#inc...原创 2018-06-09 15:51:30 · 135 阅读 · 0 评论 -
“今日头条杯”首届湖北省大学程序设计竞赛(网络同步赛)C题:Who killed Cock Robin
题目链接题意:给定一颗树,求树中联通子图个数(单个点被认为是一个联通子图)。解析:维护一个数组size[i]表示以i为根节点且含有i的联通子图个数,然后从树的下层向上传递并进行计数,我们可以知道以当前节点的子节点为根节点且含有当前节点的子节点的联通子图个数,然后逐个遍历子节点并定义一个变量temp表示遍历过前面的子节点过后可以凑成的联通子图数,那么当遍历到新的一个子节点时,在以当前节点为根且使用当...原创 2018-04-22 18:51:15 · 316 阅读 · 0 评论 -
POJ 1848 树形DP
题目链接题意:给一颗树可以在树上添加一些边使得这颗树内的点都有且仅有在一个环内,求添加的最小边数,若无解输出-1思路:定义DP数组:dp[u][0]:表示以u为根的子树包括根节点在内都在某一环内的最小添边数dp[u][1]:表示以u为根的子树除根节点以外的点都在某一环内的最小添边数dp[u][2]:表示以u为根的子树除根节点和某一树链外其余点都在某一环内的最小添边数状态转移: 定义一个sum变量,...原创 2018-06-26 17:31:08 · 219 阅读 · 0 评论 -
HDU 6201 树形DP
题目链接题意:一颗树每个点有权值表示此点买入/卖出一本书的价格。还有n-1条边,每条边有一个权值表示经过该边需要的路费。求在树上某个起点买入一本书,某个终点卖出一本书的最大收益为多少。起点和终点可以为同一点。思路:树形DP:定义dp[u]表示在u点买入一本书在以u为根的子树中卖出一本树的最大收益。因为题目要求任意起点,所以我们还需要对树进行旋转。旋转过程就是将父节点除指定子节点外其余节点视为一颗子...原创 2018-06-28 12:35:17 · 189 阅读 · 0 评论 -
HDU 6035 树形DP
题目链接题意:一棵n个结点的树,每个结点都有颜色,定义两点之间的路径长度为路径上出现的不同颜色数目,求树上所有路径的长度和。思路:此题以贡献来考虑计数,先假设每一种颜色在树中每一条路径里都贡献了,那么就有答案总贡献N*(N-1)/2*cnt(cnt表示出现的颜色种类数)然后再依次剔除颜色i所不在的路径记录在另一变量ans。剔除过程通过树形DP完成。剔除过程如下,每次我们遍历到某个根u时去它的子树v...原创 2018-06-28 15:47:31 · 289 阅读 · 0 评论 -
HDU 3899 树形DP
题目链接题意:给一颗树,每个节点有人数,边有权值,表示经过这条边所需时间,问取某个节点作为开会地点,所有人全部到达此节点开会的总时间最小,输出这个总时间。思路:树形DP:定义dp[u]表示以u根的子树上所有点到点u开会的答案,ps[u]表示以u为根的子树所有点上的人数和。根据数据定义可以简单推得方程:dp[u] = Σ(dp[v]+ps[v]*w)。使用树的旋转可以慢慢求得到各点开会的结果,取其中...原创 2018-06-28 16:31:27 · 211 阅读 · 0 评论 -
POJ 3140 树形DP
题目链接题意:删去树中的一条边将树分成两块联通块,求分成的两块联通块中权值和的差值最小值。思路:可以将分成的两块看成以某点为根的子树块以及其他。递归求子树块的和,求最小值即可。C++代码:#include<map>#include<set>#include<stack>#include<cmath>#include<queue>...原创 2018-06-09 18:54:04 · 134 阅读 · 0 评论 -
HDU 3586 树形DP+二分
题目链接题意:一颗树各边有其对应的边权,要求切断一些边使得根与树叶失去连接。要求:切断总花费<=m,单词切断花费<=limit,求最小的limit值思路:先不考虑limit这个变量限制,定义dp[u]表示以u为根的子树,切断所用与叶的连接的最小花费。切断连接的方式有两种:1.切断当前连接边,2.沿用子树内的切断方式。以这个思路进行状态转移。转移方程:dp[u] += min( w , ...原创 2018-06-10 15:28:08 · 186 阅读 · 0 评论 -
POJ 3162 树形DP+单调队列
题目链接题意:给一颗树先求树上各点最远可到距离(HDU 2196),然后求最长区间长度,并且这个区间内最远距离的最值差<=m。思路:求最远可到距离,参考HDU 2196。求最值差,我们用单调队列进行计算。q1将在当前区间的最小值保存在队列开头q2将在当前区间的最大值保存在队列开头当右端点向右移动时,为保证q1的队列开头为最小值,需要将q1内所有大于等于当前值的数全部扔出队列,同理为保证q2的...原创 2018-06-10 21:14:42 · 183 阅读 · 0 评论 -
POJ 2057 树形DP
题目链接题意:有只蜗牛将壳落在了树上的某个叶子上,蜗牛想找回它的壳。树上有许多节点,某些节点上住着虫子,虫子可以告诉蜗牛以它所在节点为根的子树上有没有蜗牛壳。题目假设蜗牛壳在树上任意叶子节点上的概率相同,求蜗牛找回蜗牛壳的最小平均期望步数。思路:定义数据如下:leaf[u]:以u为根的子树中叶子的数目。fail[u]:以u为根的子树中寻找蜗牛壳失败并返回节点u的步数。sum[u]:以u为根的子树中...原创 2018-06-22 10:24:33 · 249 阅读 · 0 评论 -
POJ 2486 树形DP
题目链接题意:一颗树上各点都有其对应的权值(经过即可获得,但仅可以获得一次),求走k步最大可以获得的权值。思路:定义dp[0][u][i]:表示以u为根走i步最终不回到u节点可以获得的最大权值。定义dp[1][u][i]:表示以u为根走i步最终走回到u节点可以获得的最大权值。状态转移:1.最终走回到u:(+2因为u走向v需要一步v走回u需要一步)dp[1][u][j+2] = max ( dp[1...原创 2018-06-22 12:44:04 · 215 阅读 · 0 评论 -
URAL 1018 树形DP
题目链接题意:一颗苹果树有n个节点和n-1条树枝,树枝上长着苹果树。求保留m条树枝可以获得的最大苹果数量,根节点1必须保留。思路:保留m条树枝其实等价于保留m+1个节点,定义dp[i][j]表示以i为根的子树保留j个节点的最大收获苹果数目。状态转移:dp[u][j] = max ( dp[u][j] , dp[v][k]+dp[u][j-k]+w );C++代码:#include<bits/...原创 2018-06-22 13:19:49 · 238 阅读 · 0 评论 -
HDU 2242 强连通分量缩点+树形DP
题目链接题意:连通图希望找一条边,使得连通图变成两个连通图,求这两个连通图点权差最小值,若无法分成两个连通图输出impossible。思路:先将图中的强连通分量缩点,缩点以后进行树形DP,需要注意此题有重边。C++代码:#include<bits/stdc++.h>using namespace std;const int maxn = 10010;const int maxm ...原创 2018-06-16 11:14:46 · 296 阅读 · 0 评论 -
ZOJ 3201 树形DP
题目链接题意:一颗树,树上各点有权值。要求从中选取一个权值和最大且节点数等于k的子树,输出最大权值和。思路:定义dp[i][j]表示从以i为根的子树中选取j个节点可以获得的最大值。状态转移 dp[u][j+k] = max ( dp[u][j+k] , dp[u][j]+dp[v][k] )因为是子树,所以需要在每个节点处ans = max ( ans , dp[n][m] )C++代码:#inc...原创 2018-06-16 09:09:38 · 177 阅读 · 0 评论 -
HDU 1011 树形DP
题目链接题意:一颗有根树,各点有一个消耗值和价值(即消耗消耗值即可获得对应价值),并且若想前往某点必须先去过其父节点,若想进入某点必须当前剩余可以消耗的东西>0。思路:定义dp[i][j]表示在节点i消耗j可以获得的最大价值。状态转移方程 dp[u][j+k] = max ( dp[u][j+k] , dp[u][j]+dp[v][k] );C++代码:#include<bits/st...原创 2018-06-15 12:53:33 · 190 阅读 · 0 评论 -
HDU 1561 树形DP
题目链接题意:有n个城堡你可以攻占m个城堡并获得其中的宝物,但是攻占有些城堡需要先攻占某些特定城堡,请问最多可以获得多少价值的宝物。思路:将无需先攻占特定城堡的城堡视为需要先攻占0号城堡(我们自行添加的,城堡中的宝物为0),那么整个城堡地图就变成了一颗n+1个节点的有根树。定义dp[i][j]表示在城堡i为根的子树里攻占j个城堡的最大收益,c[i][j]表示在城堡i为根的子树里攻占j个城堡的最大收...原创 2018-06-15 11:00:29 · 172 阅读 · 0 评论 -
POJ 1741 树的点分治
题目链接题意:求一颗树上距离<=k的点对数。思路:由一个根向下求得距离后,将距离经过排序可以O(n)时间算的以该点为根的子树下距离<=k的点对数。点对存在两种情况:1.两点来自不同子树2.两点来自相同子树不难发现如果我们递归向下求解子树中的点对数时,对于两点来自相同子树的点对我们会重复计算,所以我们进行递归求解子树时需要先将重复计算减去。如果按以上操作进行并提交,你将会得到一个TLE。...原创 2018-06-15 09:56:01 · 143 阅读 · 0 评论 -
POJ 2152 树形DP+暴力枚举
题目链接题意:给一颗树可以在树上的节点上建立消防站费用为W[i],如果不建消防站需要在距离该节点距离小于等于D[i]的地方有消防站,求使得整颗树被覆盖的最小费用。思路:定义ans数组:ans[u]表示以u为根的子树的答案定义dp数组:dp[u][v]表示节点u被建立在节点v的消防站覆盖的最小答案定义dis数组:dis[u][v]表示u,v两点之间的距离此题数据较小为1000比正常的树形DP题的数据...原创 2018-06-11 19:35:10 · 273 阅读 · 0 评论 -
HDU 5834 树形DP
题目链接题意:给一颗树既有点权又有边权,点权为到达对应点即可获得但只可以获得一次,边权为每走过该边一次就需要消耗一次边权,求从各点出发可以获得的最大权和为多少并全部输出。思路:定义dp[u][0]表示遍历子树之后不返回点u的最大权和定义dp[u][1]表示遍历子树之后要返回点u的最大权和由此可以推出状态转移方程:(dp[v][1]-2*w)表示遍历掉v子树并返回点udp[u][0] += max ...原创 2018-06-11 14:14:00 · 239 阅读 · 0 评论 -
HDU 6382 树形DP
题目链接题意:一颗有根边带权树,每个节点去往其子节点的概率为(对应边权/200000),对于从某一节点前往其子节点边的边权间可以调换,求最多调换m次从根节点到任意叶子节点的概率,输出时以mod(1e9+7)意义下的整数输出思路:对于维护根到某一叶子节点的概率时,维护路径上每一条边的一些信息:定义利用率 = 节点向叶子节点走去的最大边权/路径上对应边的边权定义原概率 = 路径...原创 2018-08-17 21:41:53 · 309 阅读 · 0 评论