bzoj4042】的更多相关文章

比较好的树形dp,涉及到树上路径的题目,我们往往考虑对路径分类 当我们考虑以x为根的子树,有这样几类路径 1. 起点终点都在子树内 2. 一个点延伸到子树外 对于要选择另一个点在子树外的路径,要建立在不破坏儿子子树内的路径基础上 因为破坏会破坏多条,而只能多选择一条,不合适 因此我们考虑树dp,设f[x]为路径起点终点在子树内能选择的最多路径数目,d[x]表示还没用过的另一个点在x子树外的路径的集合 我们知道,对于x的每个孩子d,d[y]中最多只会有1条路径被选中,因此我们可以用状压dp解决 t…
题目大意 给你一棵\(n\)个点的树和\(m\)条路径要求你找出最多的路径,使得这些路径不共边.特别的,每个点的度数\(\leq 10\). \(n\leq 1000,m\leq \frac{n(n-1)}{2}\) 题解 先对于每个点把相邻的边编号. 考虑状压DP. 设\(f_{i,j}\)为以\(i\)个点的子树内,状态为\(j\)的边的子树内的边也没有选(这些边也没选),所选的最多路径数. 然后对于每个点有很多种选法,分为两类:1.某条边不选,选对应的子树:2.选\(1\)~\(2\)条边…
设f[x]为x子树里能选的最多的路径数,h[x]为x子树里往上走的点的集合,且不与x子树内的最优解冲突 首先f[x]=sum(f[son]) 若h[son]与x可以直接匹配,则匹配上,f[x]++ 然后把剩下的未配对的son之间进行匹配,f[x]+=最大匹配数 因为度数不超过10,所以设dp[S]表示二进制表示为S的集合里的最大匹配,x=lowbit(S),则 dp[S]=max(dp[S^(1<<x)],dp[S^(1<<x)^(1<<y)]+1),其中y属于S,y&…