
树形dp
stduy_ing
这个作者很懒,什么都没留下…
展开
-
Codeforces 766 E. Mahmoud and a xor trip(树形dp + 按位运算)
链接:E. Mahmoud and a xor trip题意:给一棵树,每个点有一个权值 ,定义任意两点间的距离为:两点间所有点权的异或和 。求树中所有路径的距离和。思路:对于每个节点开一个数组记录当前节点二进制每一位 1 的个数 , 然后dp 从下往上转移即可 , 但要注意子树外的贡献很容易算重复,所以边跑边记录答案。代码:#include <iostream>#include <cstdio>#include <queue>#include <原创 2021-07-22 09:50:05 · 153 阅读 · 0 评论 -
牛客 6874 A - 巨木之森 (树的直径)
链接 : A - 巨木之森 题意:每支小队从每个点出发 ,遍历完整颗树的花费是走过路径的和,要求在花费 m 以内,最多可以有多少个小队遍历完整颗树。思路:可以求出每个点遍历整棵树的花费 ,排个序,从小到大选就好了,关键在于求花费。可以发现,要想遍历完整颗树,再回到原来的位置,那么就要把每条边都走两遍,但是现在不需要回到原来的位置,所以只要找到离根节点最远的点,用总权值的两倍减去 这条最远边的长度就好了。根据树的一个性质,离某个点最远的点一定是树直径两端点中的一个,所以我们只要求出树的直径原创 2020-09-04 15:34:16 · 221 阅读 · 0 评论 -
洛谷 2583 三色二叉树(树dp +递归建树)
链接 三色二叉树思路首先给的是一个二叉树,可以递归的把它变成我们熟悉的前向星建图,这样就和普通的树形dp 没有区别了。接下来考虑 树 dp 每个节点分为 选绿色和不选绿色两种情况,如果这个节点选了绿色,那么它所有的子节点都不能是绿色,很好转移。dpma[u][1]+=dpma[to][0];dpmi[u][1]+=dpmi[to][0];对于当前节点不选绿色的情况,那么子节点可以选一个绿色,我们可以先把子节点全不为绿色的和算出来,再一个一个替换为绿色,找最大最小值。但需要注意的是,如原创 2020-06-15 10:29:54 · 420 阅读 · 0 评论 -
牛客 19772 Tree ( 树 dp + 逆元 )
链接: Tree题意:求一棵树中包含每个点的联通点集的数量,答案对 1e9+7取模。思路:大致思路是,求出每个点的子树内包含该点的联通点集数量,然后换根就可以得到每个点的答案,但因为换根的时候涉及到除法,而分母为 0 的时候是不能求逆元的,所以还要把这个节点特殊考虑一下。求子树内包含每个节点的点集合=数很好求 ,就是 dp1[u]=(dp1[u]%mod*(dp1[to]+1)%mod)%mod;然后考虑换根,当前节点的答案为 (子树外的答案+1)* 子树内的答案,子树外的答案可以由当前节点原创 2020-07-12 20:50:46 · 184 阅读 · 0 评论 -
CSUST 2036 随刄而行 ( 树 dp )
链接: 随刄而行题意:给一棵有根树,每个节点有一个权值,定义树的完美程度为节点的权值和,可以花费 m 的代价砍掉一颗子树,求最大完美程度。思路:大概就是 dp[ i ] [ j ] ( j=0 || j=1)表示选和不选 i 节点,选 i 节点 又可以由 选不选子节点转移,而如果不选 i 节点 那么它的权值即为 -m(就是直接把它砍掉,和子节点无关了) ,然后就愉快的 wa 了 ,注意数据范围,m有可能是 负数 (这里就比较坑),所以我在砍 i 节点的子树时 ,可以一个节点一个节点的砍,那么就能原创 2020-07-15 17:37:04 · 157 阅读 · 0 评论