随笔分类 -  动态规划-树形dp

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

点击右上角即可分享
微信分享提示