树形DP
EMber _
人但有追求,世界亦会让路。
展开
-
51nod 1378 夹克老爷的愤怒
1378 夹克老爷的愤怒 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 夹克老爷逢三抽一之后,由于采用了新师爷的策略,乡民们叫苦不堪,开始组织起来暴力抗租。 夹克老爷很愤怒,他决定派家丁常驻村中进行镇压。 诺德县 有N个村庄,编号0 至 N-1,这些村庄之间用N - 1条道路连接起来。 家丁都是经过系统训练的暴力机器,每名家丁可以被派驻在原创 2017-02-11 10:54:35 · 376 阅读 · 0 评论 -
51nod 1299 监狱逃离 树形dp/最小割
题意:监狱有N条道路连接N + 1个交点,编号0至N,整个监狱被这些道路连在一起(任何2点之间都有道路),人们通过道路在交点之间走来走去。其中的一些交点只有一条路连接,这些点是监狱的出口。在各个交点中有M个点住着犯人(M <= N + 1),剩下的点可以安排警卫,有警卫把守的地方犯人无法通过。给出整个监狱的道路情况,以及犯人所在的位置,问至少需要安排多少个警卫,才能保证没有1个犯人能够逃到出口,如果原创 2017-10-26 08:26:38 · 264 阅读 · 0 评论 -
JZOJ5418. 【NOIP2017提高A组集训10.24】 树形DP+组合数
题意:给出n个数,有一些特定要求,形如x,y表示x一定要在y的左边,求排列方案数。一早上死想序列做法,想到了一下连边然后否决了。。然后想出了50分的容斥或者状压,然后觉得100分是不是再优化一下啥的,然后就再没脱出坑。。 事实证明部分分做法不一定是正解做法的暴力版本。。 首先有一个条件就是每一个人最多提出一个要求。 那么连边后的dag是一个森林,不相交的n棵树。 那么对于每一棵树,我们从下往原创 2017-10-24 17:05:12 · 327 阅读 · 0 评论 -
bzoj1023 [SHOI2008]cactus仙人掌图 树形DP+单调队列
题意:给一颗仙人掌求直径。 经典好题。 一开始naive的想以为缩点以后直接求,想了想感觉自己是傻子。。块内的根本无法统计。 大概能想到DP求解,但是单调队列真心被震惊到了= = 设f[x],表示以x为起点(从上往下)的最长路径,对于树边/非树边分别转移,树边当让直接转移了,主要是非树边,非树边就是环上边,我只用环上的点更新f[x](x为环上深度最小点),这个需要DP。 树边情况,对于f[原创 2017-10-17 16:43:01 · 266 阅读 · 0 评论 -
JZOJ5233 【GDOI模拟8.5】概率博弈 树形dp
妈耶,改这题各种失误,清空都能清错,本来清x然后清空了儿子,服了。 区间题做多了下意识leaf[1]-i+1 服气。 Description小A和小B在玩游戏。这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值。假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列。 一开始在1号点有一颗棋子。两人轮流将这颗棋子移向其当前位置的一个儿子。假如棋子到达叶子,游戏结束,原创 2017-08-05 21:54:54 · 396 阅读 · 0 评论 -
【GDOI2018模拟7.7】暴力大神hxx 树形dp
题意:给你n个嵌套for语句,然后从第二个开始每一个循环的起点或者是终点是变量,问你会循环多少次。这是一道好题。 手玩一下可以很容易发现,上下之间有可以递推的关系,但是直接递推会炸,所以需要dp。 假设语句是这样的: for i 1 100 for j i 100 for k j 100 我们可以手玩一下发现: 只有一条语句: 1-100 两条语句: (1-100,2-100原创 2017-07-07 20:55:28 · 491 阅读 · 0 评论 -
bzoj1040 [ZJOI2008]骑士
题意:给出基环树林,求最大点独立集。 第一次打基环树。。感觉姿势奇奇怪怪。。%一发po姐的题解,感觉po姐题解很简洁易懂。 对于每棵基环树,我们找到环上的一条边,设边上的两端点分别为u和v,f[i]为以i为根的子树在取i点的情况下的最大权值,g[i]为不取,于是我们有以下做法: 1.断掉这条边 2.u不取,v任意,我们以u为根跑一遍树形DP,取g[u] 3.v不取,u任意,我们以v为根跑一原创 2017-04-07 16:14:47 · 355 阅读 · 0 评论 -
bzoj 3611 [Heoi2014]大工程 虚树DP
题意就不说了,比较复杂,自己看吧。分析: 我还是naive了,居然想着直接做。。以后看见这种询问个数之和<=n的直接无脑上虚树。 至于虚树跟之前的那个消耗战差不多。但是dp就很复杂了,不好做,要把每个点单独 拿出来做。具体转移看标程吧。#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>原创 2017-02-12 22:18:55 · 248 阅读 · 0 评论 -
bzoj 2286 SDOI2011 消耗战 虚树dp
题意就不说了。分析: 这题其实就是让你切代价最小的边使得k个点与根不联通,可以设一个和暴力的DP。设val[i]表示要让i和根断开的代价。很显然有f[i]=min(Σf[son],val[i])val[i]=max(len[i到fa[i]],val[fa[i]]);时间复杂度是O(N),加上询问以后就是O(NM),妥妥的超时。。一开始我还想着是不是要加上数据结构什么的,结果发现好像没有数据原创 2017-02-12 18:28:42 · 287 阅读 · 0 评论 -
bzoj 2500 幸福的道路 动态规划+单调栈
题意:给出一棵树,每条边都有一个长度。我们规定每个点的权值为从该点开始走过的一条最长的路径的长度。 求一个最长的区间[l,r],使得[l,r]里面点权的最大值和最小值只差不超过m。 n<=1000000一开始看错题目了,结果卡了半天。。最后发现是一道大水题。 先求点权,直接DP求,经典模型啊。。随便写。 后面求出点权之后,单调队列就更简单了,随便搞。 然后等我切了以后看别人的题解才发现原创 2017-02-12 11:51:50 · 282 阅读 · 0 评论 -
POJ2486 Apple Tree 树形DP
题意:给你一个图,每个点有一些权值,问你在k步内怎么得到最大权值。(一个点的权值只能获得一次)。n<=300。题解:一开始:我去这不水题,直接f[i,j]i节点走j步这不随便搞?结果改了半天样例过不了,才发现可以往回走= =,然后就懵比了。事实上,对于多出来的条件限制。我们可以对应的加上一维来推导,即设f[i,j,0/1]表示是否会回到i这个点。那么就可以直接推导了。 如果当前不回到i点: 1.原创 2017-02-11 16:18:09 · 291 阅读 · 0 评论 -
POJ1947 Rebuilding Roads 树形DP
题意:给你一棵树,然后问你最少切多少刀可以剩下p个节点 n,p<=200吧,大概。 又是经典模型,设f[i,j]表示以i为根的子树中,最少去掉多少条边能剩下j个节点。 那么就是分类讨论咯。。 设v是x的子树,x是当前节点 有: 1.不切v子树,那么就有f[i,j]=min(f[i,j],f[i,k]+f[v,j-k]);(0<=k<=j) 2.切,那么直接f[i,j]++就可以了。#i原创 2017-02-11 15:10:53 · 218 阅读 · 0 评论 -
51nod 1500 苹果曼和树 树形DP
题意:给你一棵树,每个点只有黑色或者白色两种颜色,要求通过切割边把树分成k个树使得每个树内只有一个黑色点。 原谅我菜,没有第一时间想到转移方程。弱的跟鬼一样了。 设f[i][0/1]f[i][0/1]表示以i为根的块内部有一个或者0个黑色点,注意这里的块是未来最终分割而成的块,而不是现在的子树。 那么我们就可以转移了,初始化状态为f[x][bz[x]]=1。 对于一个状态为1的点x,他既可以原创 2017-10-26 21:54:35 · 338 阅读 · 0 评论