树型dp
文章平均质量分 58
IcePrincess_1968
这个作者很懒,什么都没留下…
展开
-
Codeforces GYM 100962J: Jimi Hendrix 题解
显然树形dpdp1[i]表示以i为根的子树中从左往右最多能匹配多少位,dp2[i]表示以i为根的子树中从右往左最多能匹配多少位dp数组同时记录这个max是从哪个叶子跑上来的dp1[i]和dp2[i]能很简单的从i的孩子那里统计得到然后对于任意i,只要dp1[i]+dp2[i]>=m 就说明有答案要注意从左往右和从右往左要从不同的孩子那里获得,所以烦一点的话可能要写一个second_max#i...原创 2018-01-23 11:47:52 · 369 阅读 · 0 评论 -
BZOJ2657: 旅游 题解
把一个凸包进行三角剖分,那么如果把每个三角形看成一个节点,有相邻边的三角形之间连一条边,那么这就成了一个树形结构 我想了一下,认为能连接凸包上两点所经过的三角形,一定是新树中的一条链,所以只要树型dp求最长链即可 处理相邻的三角形有点麻烦,我用了一个比较轻巧的方法:把每个三角形的三条边放进一个map,然后每新读入一个三角形就把他的三条边扔进map里查,如果出现过了就可以连边#inclu...原创 2018-05-31 10:02:46 · 476 阅读 · 1 评论 -
AtCoder Grand Contest 024E: Sequence Growing Hard 题解
神仙题,感觉思路太神奇 题目等价于每次向序列里面插入一个新数,问有多少种方案 我们考虑怎样插入一个新数是合法的,假设当前插入的数是cur,那么有两种情况 1. cur放在序列的末尾 2. cur之后第一个与cur不一样的数比cur小(或者cur后面的数全都和cur一样) 我们发现改一下这个问题的初始条件,不是空序列,而是一个包含一个0的序列,这两种情况就变成只有第二种情况了,而且括号里的...原创 2018-05-21 20:32:09 · 431 阅读 · 0 评论 -
AtCoder Regular Contest 097F: Monochrome Cat 题解
这道题的思路非常巧妙 首先我们可以把那些全部都是黑点的子树扔掉,他们是不会被遍历的 这时,剩下的树的所有的叶子都是白色的 我们先考虑终点和起点重合的情况 这时如果我们想把它全部变黑的话必须遍历整棵树 并且我们发现,无论以哪个点为起点,答案都是一样的,首先所有的边都要走两遍,第二,一个点被走过的次数等于它的度数,所以一个点是否需要停留一秒也是可以算出来的(显然的是,一个点最多停留一秒),这...原创 2018-05-14 16:30:26 · 667 阅读 · 6 评论 -
AtCoder Regular Contest 083E: Bichrome 题解
首先,一棵子树究竟是白色满足Xi还是黑色满足Xi是无关紧要的,因为我们总可以翻转所有的节点来得到满足条件的解 对于每棵子树,某种颜色的权值和已经是固定的了,我们自然关注另一种颜色的权值和 可以想到dp[i][j]表示当前在考虑以i为根的子树,与根颜色不同的节点权值和是j且该子树内所有的Xi均满足能否实现 我们显然希望通过对子树背包来实现这一点 我们令dp2[i][j][k]表示当前考虑到第...原创 2018-04-20 16:56:27 · 273 阅读 · 0 评论 -
BZOJ1912: 巡逻 题解
这道题很像topcoder里的一道题kingdomtour,是它的弱化版,可以看我的那道题的博客,一个树型dp,复杂度O(nk2)O(nk2)O(nk^2)#include <cstdio>#include <iostream>#include <cstring>#include <string>#include <cstdli...原创 2018-04-12 17:09:16 · 286 阅读 · 0 评论 -
ZOJ4007: Maching Learning on a Tree 题解
这道题看起来很难很高端,仔细读一遍以后发现是水题 它规定了所有的xixixi都相等,意味着所有的wij=e0=1wij=e0=1w_{ij}=e^{0}=1 所有的点的权值只能是0或1 考虑树型dp,dp[i][0/1]表示当前考虑以i为根的子树,i的权值是0/1的最小代价 转移非常简单#include <cstdio>#include <iostream>...原创 2018-04-03 16:09:16 · 180 阅读 · 0 评论 -
Codeforces #101D: Castle 题解
尝试思考每棵子树应该按照什么样的顺序访问 要访问完一棵树的总时间肯定是这棵树内所有的边权之和×2,将这个值定义为T(x)T(x)T(x),其中xxx表示子树的根,再定义sz(x)sz(x)sz(x)表示以xxx为根的子树的节点数,考虑某个节点的两棵子树x,yx,yx,y,如果先访问xxx比先访问yyy更优,那么应该满足如下条件: T(x)+T(x)∗sz(y)+T(y)<T(y)∗T(y...原创 2018-04-10 09:17:21 · 259 阅读 · 0 评论 -
Codeforces #219D: Choosing Capital for Treeland 题解
显然的树型dp题 发现一个性质,如果我的首都选在以i为根的子树内,那么无论选的是哪个点,以i为根的子树外面的边最终的指向都是一样的 我们先跑一边dfs,把每棵子树内的向上的边数和向下的边数记录下来 考虑dp[i]表示如果首都在以i为根的子树内,在以i为根的子树内需要翻转的最小边数 有两种转移:首都是i,此时需要翻转的边数就是以i为根的子树内向上的边数首都在i的某个孩子y的子树中,那...原创 2018-04-09 23:01:19 · 250 阅读 · 0 评论 -
BZOJ4753: 最佳团体 题解
首先肯定是01分数规划,先二分答案,设当前答案是xxx,那么每个点的权值就是ai−xbiai−xbia_i-xb_i,我们要在树上取一个包含节点0的大小为k+1k+1k+1的连通块(因为有0所以+1),使得权值最大,然后看这个最大权值是否大于等于0 这个可以考虑树型背包 这个看上去是O(n3)O(n3)O(n^3)的,但有一个小技巧可以让他变成O(n2)O(n2)O(n^2) 我们考虑一个和...原创 2018-04-09 21:42:48 · 234 阅读 · 0 评论 -
BZOJ3611: 大工程 题解
虚树模板题构建虚树的流程大概是这样的0. 对原树跑dfs序1. 把当前给的点按照dfs序排序,维护一个栈存储还没有连好边的点2. 枚举每一个点,对于当前轮,求出当前点i与栈顶元素top的lca3. 只要当前的lca是栈顶元素的祖先(即深度比它浅)就相当于那一条链上的信息已经处理完了,我就把它弹出,存到一个rev数组里4. 将rev数组里的元素从后向前顺序连边5. 如果lca与当前栈顶元素不相等,把...原创 2018-03-23 13:44:25 · 217 阅读 · 0 评论 -
Codeforces #48G: Galaxy Union 题解
n个点n条边的连通图,是一个基环外向树先用一遍深搜把环找出来然后对于每一个点的答案,他到树内部的答案可以树型dp搞一搞,到其他树以及到环上的点的答案可以在环上two pointers搞一搞主要是一道代码能力题#include <cstdio>#include <iostream>#include <cstring>#include <string&g...原创 2018-03-06 13:05:52 · 370 阅读 · 0 评论 -
Codeforces #995F: Cowmpany Cowmpensation 题解
非常好的dp题 首先可以参见topcoder randomapple的套路,就是我算这棵树的权值种数为i的方案数,最后乘CiDCDiC_D^i就好 考虑dp[i][j]表示以i为根的子树,i的权值不超过j的方案数 我们发现这样会重复计数,因为我们计算了一些本质相同的方案,比如全1和全2,他们各自在乘CiDCDiC_D^i的时候会把对方算进去 所以我们实际上要算的是本质不同的方案数 dp[...原创 2018-06-30 21:46:55 · 628 阅读 · 2 评论