树形dp
文章平均质量分 52
Jozky86
这个作者很懒,什么都没留下…
展开
-
F.孤独(牛客小白月赛39)
F.孤独(牛客小白月赛39)题意:给定一棵树,寻找一个路径,将断掉所有与这个路径上的点相连的边,使得剩下的最大连通块的大小最小题解:这题有点印象,感觉做过,至少这个方法肯定遇到过设dp[u]表示以u为根的子树里,删除以u为起点的路径后最大连通块的大小最小是多少我们贪心的去进行转移,它一定是选择最大儿子去走路径去删除,因为只有这样才会影响到最大连通块(最大儿子意味着最大连通块)所以转移方程为:dp[u]=max(sz[v2],dp[v1]),最大连通块要么是以v1为根删除得到的最大连通块,要么原创 2021-10-23 19:59:34 · 159 阅读 · 0 评论 -
Monster Hunter(2020南京M)
Monster Hunter(2020南京M)题意:给你一颗树,树上每个节点都是一个hpi 血量的怪物。打败每个怪物所需要的能量值为hpi + 所 有 存 活 的 直 接 子 节 点 的 hpj 。每次必须要消灭父节点后才能消灭子节点。此外你还有m个魔咒,每个魔咒可以不耗费能量且可以消灭任意一个存活的怪物(无论其父亲节点是否存在)。问你m=0,1,2,3…,n时的最低总能量花费分别为多少。题解:不难看出树形dp那我们可以设状态为:dp[i][j]:表示i的子树还剩j个点的最小花费(其他i-j相当原创 2021-09-15 15:44:05 · 295 阅读 · 0 评论 -
P2634 [国家集训队]聪聪可可(树形dp)
题意:一颗n个点的树,问其中两点之间的边上数的和加起来是3的倍数的点对有多少个?输出这样的点对所占比例题解:树形dp求解因为是求长度为3的倍数,模3的结果只有0/1/2,我们可以单独考虑作为一维。设dp[i][j]表示从i的子树里任选一点到i的路径长度(mod 3)为j的方案数有转移:v是u的儿子节点j∈0,1,2j∈0,1,2j∈0,1,2dp[u][j]=∑dp[v][(j+dist(u,v))mod 3]dp[u][j]=\sum dp[v][(j+dist(u,v))\mod3原创 2021-08-19 15:53:00 · 130 阅读 · 0 评论 -
CF 1529C Parsa‘s Humongous Tree
CF 1529C Parsa’s Humongous Tree题意:给你一颗n个点,n-1个边的树,每个点的点权为一个区间值,树的值为边权和。边权为该边的两个端点的点权差的绝对值的和问树的值最大是多少?题解:这个题给的点权是一个范围值,范围值的话如何找打最佳值?结合题目给的边权计算方法:两个点的权值差的绝对值,如果一个点权是[a,b],另一个是[c,d],那边权的最大值要么是abs(a-d),要么是abs(b-c),也就是端点之间的差,这样每个点的点权就是二选一,我们可以用树形dp来解答dp[原创 2021-07-11 18:42:42 · 160 阅读 · 0 评论 -
(牛客网)树型dp
树型dp视频链接(如果想购买网课,可以用我的邀请码)用我的链接购买,我再反你10,一共花54多值购买链接不放心可以先加我好友2830872914总试题链接文章目录树型dpNC15033 小G有一个大树NC511788 没有上司的舞会(最大独立集)poj1463 NC106060 Strategic game(树的最小点覆盖)NC24953 CellPhoneNetwork(树的最小支配集)以上小总结:NC50505 二叉苹果树延伸-->多叉树情况NC202475 树上子链(树的直径)NC原创 2020-08-22 15:59:44 · 347 阅读 · 0 评论 -
吉吉王国(二分+树形dp)
吉吉王国题意:n个点,m个边,有边权,现在要求叶子节点无法与1号点连通,要求切断的总长度不能超过m,且切断的最长的长度尽可能断题解:题意的前半部分可以确定是树形dp,后半部分可以确定为是二分树形dp部分和这个题差不多Rinne Loves Edges我们二分一个长度的上限,然后在dp中限制,判断二分的值是否合理代码:#include <bits/stdc++.h>#define endl '\n'using namespace std;const int maxn=1原创 2021-07-10 17:10:17 · 263 阅读 · 0 评论 -
Rinne Loves Edges
Rinne Loves Edges题意:有n给点,m个边,每个边有边权,给你一个点S,问最少花多少代价,可以让叶子节点无法与S点连通题解:dp[u]:表示u到叶子节点的最短费用的和dp[u]+=min(dp[v],w);代码:#include<bits/stdc++.h>#define debug(a,b) printf("%s = %d\n",a,b);typedef long long ll;using namespace std;inline int read(){原创 2021-07-10 16:16:13 · 141 阅读 · 0 评论 -
树上子链(树形dp求树的直径)
树上子链题意:给定一棵树 T ,树 T 上每个点都有一个权值。定义一颗树的子链的大小为:这个子链上所有结点的权值和 。请在树 T 中找出一条最大的子链并输出。题解:求树的直径,题目中存在负权值,树形dp求树的直径可以处理负边权直径的模板:void DP(int u,int pa){ dp[u]=0; for(int i=head[u];i;i=E[i].nxt) { int v=E[i].v; if(v==pa) continue;原创 2021-07-10 15:58:16 · 316 阅读 · 0 评论 -
P2015 二叉苹果树
P2015 二叉苹果树题意:一个完全二叉树,n个点,n-1个边,每个边都有边权,问保留q个边,所能保留的最大边权是多少题解:树形dpdp[u][i]表示u的子树上保留i条边,至多保留的苹果数目如何建立状态转移方程呢?我们设v是u的一个子节点,现在以u为根的子树要保留i个边,那我们可以让v保留j个边,u和v之间就有一个边,u只需要保留i-j-1个边即可(相当于u的儿子节点v分担了一部分任务,另一部分其他负责)这样可得:dp[u][i] = max(dp[u][i],dp[v][j]+w[u]原创 2021-07-10 13:03:18 · 274 阅读 · 0 评论 -
P2016 战略游戏
P2016 战略游戏题意:他要建立一个古城堡,城堡中的路形成一棵无根树。他要在这棵树的结点上放置最少数目的士兵,使得这些士兵能了望到所有的路。注意,某个士兵在一个结点上时,与该结点相连的所有边将都可以被了望到。请你编一程序,给定一树,帮 Bob 计算出他需要放置最少的士兵。题解:和这个题是一样的Strategic game(树的最小点覆盖)代码:#include<bits/stdc++.h>#define debug(a,b) printf("%s = %d\n",a,b);原创 2021-07-08 18:26:05 · 109 阅读 · 0 评论 -
Acwing 1072. 树的最长路径
Acwing 1072. 树的最长路径题意:每个边有权值,求树的直径题解:两遍dfs可以求,这里用树形dp的方法,我们将1作为根节点来看这棵树我们可以将点看作是钉子,边就是挂在钉子上的绳子,我们只需要求出第一长和次长的绳子,就可以得到最长的路径详细过程不作表述代码:#include<bits/stdc++.h>#define debug(a,b) printf("%s = %d\n",a,b);typedef long long ll;using namespace st原创 2021-07-08 17:46:58 · 181 阅读 · 2 评论