![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树形dp
文章平均质量分 63
_Rain_Stopped
这个作者很懒,什么都没留下…
展开
-
POJ 3140 树形dp
题意:一棵n个结点的带权无根树,从中删去一条边,使得剩下来的两棵子树的节点权值之和的绝对值最小,并求出得到的最小绝对值。 水题,首先把每棵子树的权值之和处理出来,在dfs一次做一下比较就好 #include #include #include #include #include #include #include #include #define LL long long us原创 2016-05-28 08:41:48 · 390 阅读 · 0 评论 -
POJ 1655 Balancing Act 树形dp
题意:一棵树,定义每个节点的balance值:去掉这点节点后的森林里所有树的最大节点数。求出最小的balance值和其所对应的节点编号。 对于删除的每一个点,计算下它的每颗子树的节点数与剩余的子树的节点数,做一下比较。 dp[x][0] 以x节点为根的子树的最大节点数 dp[x][1] 包含x祖先的子树的节点数 注意边界的处理 #include #include #include原创 2016-05-28 08:47:05 · 397 阅读 · 0 评论 -
POJ 1155 经典树形dp+分组背包 + 模板
题意:电视台发送信号给很多用户,每个用户有愿意出的钱,电视台经过的路线都有一定费用,求电视台不损失的情况下最多给多少用户发送信号。 dp[i][j]代表i节点为根节点的子树j个用户的时候最大剩余费用。 dp[i][j] = max(dp[i][j], dp[i][k]+dp[son][j-k]-w[i][son]); #include #include #include using n原创 2016-05-23 10:15:54 · 742 阅读 · 0 评论 -
HDU 4276 树形dp+spfa+分组背包
题意:给你n个点,n-1条边构成树,每条边有边树,每个点有点权(表示走每条边的时间),问在时间T从点1走到点n,能够得到最多的点权有多少。 首先我们至少要保证1到n的最短路在时间内,此时用spfa,其次,在最优的情况下,最短路径上的边只会经过一次,而其他边会经过两次,对于最短路上的边,spfa走的时候记录权值,然后赋值为0就可以了。对于其他边就可以跑树形dp了。 #include #incl原创 2016-05-23 10:32:34 · 477 阅读 · 0 评论 -
HDU 4003 树形dp+分组背包
求K个机器人从同一点出发,遍历所有点所需的最小花费 注意到,对于某个节点为根节点的子树,如果需要遍历完再回来,一个机器人遍历的花费 #include #define INF 0x3f3f3f3f using namespace std; const int maxn = 1e4+6; int dp[maxn][12],head[maxn],n,kk,s,num; struct list {i原创 2016-05-23 10:22:08 · 585 阅读 · 0 评论 -
POJ 2486 树形dp
题意:一颗树,n个点(1-n),n-1条边,每个点上有一个权值,求从1出发,走V步,最多能遍历到的权值 dp[root][k]表示以root为根的子树中最多走k时所能获得的最多苹果数 在经典树形dp的套路上,注意到有时候走完一条路需要返回,此时需要考虑走完某个节点需不需要回来 dp[root][j][0] = MAX (dp[root][j][0] , dp[root][j-k][0]原创 2016-05-23 10:10:03 · 412 阅读 · 0 评论