随笔分类 - 动态规划-树形dp
摘要:题目链接 "BZOJ4919" 题解 链上的$LIS$维护一个数组$f[i]$表示长度为$i$的$LIS$最小的结尾大小 我们可以用$multiset$来维护这个数组,子树互不影响,启发式合并 一个点取更新数组时,只会改变第一个比它大的地方,因为这个点一定是将比它小的位置$+1$,只有$+1$后位置
阅读全文
摘要:题目链接 "hdu5909" 题解 设$f[i][j]$表示以$i$为根的子树,$i$一定取,剩余节点必须联通,异或和为$j$的方案数 初始化$f[i][val[i]] = 1$ 枚举儿子$v$转移 $$f[i][j] = f[i][j] + \sum\limits_{x \; xor \; y =
阅读全文
摘要:题目链接 "BZOJ2878" 题解 除了实现起来比较长,思维难度还是挺小的 观察数据范围发现环长不超过$20$,而我们去掉环上任何一个点就可以形成森林 于是乎我们枚举断掉的点,然后只需求出剩余每个点为根的答案 设$f[i]$表示从$i$出发等概率走向子树的期望步数 如果$i$为根就是我们所需的答案
阅读全文
摘要:题目链接 "BZOJ3829" 题解 设$f[i]$为从$i$父亲进入$i$之前开始计时,$i$的子树中最晚装好的时间 同时记$siz[i]$为节点$i$子树大小的两倍,即为从父亲进入并回到父亲的时间 那么有 $$f[i] = max\{C[i],f[to] + siz_{pre}\} + 1$$
阅读全文
摘要:题目链接 "BZOJ3522" 题解 就是询问每个点来自不同子树离它等距的三个点的个数 数据支持$O(n^2)$,可以对每个距离分开做 设$f[i][j]$表示$i$的子树中到$i$距离为$j$的点的个数 利用换根法可得到每个点作为根时的值 然后随便容斥一下就是答案 C++ include incl
阅读全文
摘要:题目链接 "loj2542" 题解 设$f[i][S]$表示从$i$节点出发,走完$S$集合中的点的期望步数 记$de[i]$为$i$的度数,$E$为边集,我们很容易写出状态转移方程 ①若$i \notin S$ $$f[i][S] = \frac{1}{de[i]}\sum\limits_{(i,
阅读全文
摘要:题目链接 "BZOJ1495" 题解 观察表格,实际上就是分$A$多和$B$两种情况,分别对应每个点选$A$权值或者$B$权值,所以成对的权值可以分到每个点上 所以每个非叶节点实际对应一个状态,表示子树$AB$数量关系 设$f[i][j][s]$表示节点$i$子树中选了$j$个$A$,其祖先的状态为
阅读全文
摘要:题目链接 "BZOJ2159" 题解 显然不能直接做点分之类的,观察式子中存在式子$n^k$ 可以考虑到 $$n^k = \sum\limits_{i = 0} \begin{Bmatrix} k \\ i \end{Bmatrix} {n \choose i}i!$$ 发现$k$很小,对于每个点可
阅读全文
摘要:题目链接 "BZOJ5333" 题解 看到式子,立即想到二叉树上一个点及其$k$个父亲权值和【如果有的话】模$m$意义下为$0$ 考虑如何满足条件 我们假设$1$号为第$0$层 那么我们先满足第$k$层的条件 由于第$k + 1$层也满足条件 由同余的性质第$k + 1$层的权值等于第$1$层的权值
阅读全文
摘要:题目链接 "BZOJ5314" 题解 设$f[i][j][0|1][0|1]$表示$i$为根的子树,用了$j$个监测器,$i$节点是否被控制,$i$节点是否放置的方案数 然后转移即可 $O(nk^2)$?? 用上子树大小来优化就是$O(nk)$的 对于子树大小都超过$k$的子树,转移$O(k^2)$
阅读全文
摘要:题目链接 "BZOJ1596" 题解 先抽成有根树 设$f[i][0|1][0|1]$表示以$i$为根,儿子都覆盖了,父亲是否覆盖,父亲是否建塔的最少建塔数 转移一下即可 C++ include include include include include include define Redge
阅读全文
摘要:题目链接 "BZOJ4035" 题解 神题啊。。。orz 不过网上题解好难看,数学推导不写$Latex$怎么看。。【~~Latex中毒晚期~~】 我们由题当然能很快写出$dp$方程 设$f[i]$表示从$u$出发逃离的期望步数,$m$为该点度数 $$ \begin{aligned} f[u] &=
阅读全文
摘要:题目链接 "uoj185" 题解 设$f[i][j]$表示$i$为根的子树,$i$号点对应图上$j$号点时的方案数 显然这样$dp$会使一些节点使用同一个节点,此时总的节点数就不满$n$个 我们枚举选的点$S$,再进行$dp$ 然后根据选的点数量进行容斥 【BZOJ卡不过QAQ】 C++ inclu
阅读全文
摘要:题目链接 "BZOJ4890" 题解 枚举断开哪一条边,然后对剩余的两棵树分别做一遍换根法树形dp 需要求出每个点到树中其它点距离的最大值$f[i]$和次大值$g[i]$【用以辅助换根计算最大值】 求出每棵树中的最长路径,然后再将两棵树中$f[i]$最小值相连保证相连后产生的最大值最小 $O(n^2
阅读全文
摘要:题目链接 "BZOJ4824" 题解 观察出题目中的关系实际上是完全二叉树的父子关系 我们设$f[i][j]$为以$i$为根的节点在其子树中排名为$j$的方案数 转移时,枚举左右子树分别有几个节点比$i$小,进行转移 乍一看是$O(n^3)$的,但其复杂度分析和某一题很像 就是在根处枚举两个子树大小
阅读全文
摘要:题目链接 "POJ" 题解 背包树形dp板题 就是读入有点无聊,浪费了很多青春 C++ include include include include include include include define LL long long int define REP(i,n) for (int i
阅读全文
摘要:题目链接 "POJ3585" 题解 二次扫描与换根法 对于这样一个无根树的树形dp 我们先任选一根进行一次树形dp 然后再扫一遍通过计算得出每个点为根时的答案 C++ include include include include include define LL long long int de
阅读全文
摘要:题目链接 "选课" 题解 基础背包树形dp C++ include include include include include define LL long long int define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt) defi
阅读全文
摘要:题目链接 "BZOJ1017" 题解 orz "hzwer" 树形dp神题 设$f[i][j][k]$表示$i$号物品恰好花费$k$金币,并将$j$个物品贡献给父亲的合成时的最大收益 计算$f[i][j][k]$时,我们先枚举合成了x个$i$号物品,计算出此时的花费各种金币下最大收益 然后就可以枚举
阅读全文
摘要:题目链接 "hdu5834" 题解 思路很粗犷,实现很难受 设$f[i][0|1]$表示向子树走回来或不回来的最大收益 设$g[i][0|1]$表示向父亲走走回来或不回来的最大收益 再设$h[i]$为$f[i][0]$的次优收益 对于$f[i][1]$,贪心选择所有$f[v][1] 2 w \ge
阅读全文

浙公网安备 33010602011771号