
树形dp
文章平均质量分 80
麻袋君
这个作者很懒,什么都没留下…
展开
-
poj 3162 WalkingRace 树形dp+线段树
题目大意:从任意一个结点出发,都要走到距离当前距离的最远的点,然后把这些距离存储下来,求差值在一定范围内最长的连续序列长度是多长;解题思路:求树上任意一点到树上某一点的最远距离,我们可以证明这一点一定是树的直径中的某一个端点;我们可以通过3次dfs找出树上每一点的最远距离;然后通过控制l,r来寻找区间最长的连续序列,这期间通过线段树查找区间的最大最小值;#include#in原创 2015-04-18 13:52:04 · 429 阅读 · 0 评论 -
poj 1655 Balancing Act
题目大意:给你一棵树,求树的重心以及该节点的子树的最大结点数;解题思路:先给大家普及一下基础知识;树的重心:如果在树中把树的重心删除后,那么会把树分成几个部分,这几个部分中的点的个数(即子树的结点个数)的最大值会是最小的;解决方法:首先我们得知道树的各个结点数以及他们子树的最大结点个数,对于任意一个非根结点,总有一个父亲结点和一堆子孙结点,我们在计算一个结点的最大子树结点个原创 2015-04-16 00:08:52 · 393 阅读 · 0 评论 -
poj 3107 Godfather
题目大意:求一颗树的所有重心;解题思路:树的重心的求法我在poj 1607中详细讲过,这里就不说啦,这道题目是要求求出所有的重心,因此题目中会有很多最小的最大子树结点数相同,我们只需要在求最小值的时候处理一下等于号,如果不相等,置空答案数组重新存储,如果相等,则在答案数组中顺次存储;#include#include#includeusing namespace std;#d原创 2015-04-16 00:41:47 · 429 阅读 · 0 评论 -
hdu 2196 computer
题目大意:给你一颗树,让你求出树上每一个点可以到达的最远的距离解题思路:先以第一个顶点为根,进行一次dfs,找出从第一个点出发的最长的一个直径,然后再以直径的另外一个端点a,为根进行一次dfs,又可以找出另外一个端点b,可以证明(a,b)即为树的直径(树上任意俩点最远的距离),此外任意一个点的最远距离肯定是以树的直径的某一端点为端点的下面是对这种证法的详细证明:(不原创 2015-04-15 07:18:42 · 417 阅读 · 0 评论 -
hdu 1561 The more, The Better
题目大意:英文题目,汉语题面,,,不解释了;解题思路:dp[i][j]表示从i结点出发,攻击j个城市,可以获得的最大的价值;初始化,dp[i][1]=val[i];只有一个结点的时候,肯定要选择当前的结点啦,价值也是当前结点的价值;dp[i][j+k]=max(dp[i][j+k],dp[i][j]+dp[v][k]);如何体现攻击子孙结点的时候要先攻击父亲结点呢?我们进行原创 2015-04-20 17:19:56 · 352 阅读 · 0 评论 -
POJ 1947 Rebuilding Roads
题目大意:给你一棵树,问要切割出节点数为m的子树,至少需要多少次切割;解题思路:我们考虑i结点为根结点,那么切割出j个结点需要的最少的次数;dp[i][j]表示以i为根结点,切割出j个结点的子树(该子树包含i结点),那么对与每一个根结点,dp[i][1]我们不考虑它的父亲结点,则需要size【i】次,这里size是它的直接相连的子孙个数,注意直接相连;对于状态dp[i][j],原创 2015-04-20 16:23:20 · 383 阅读 · 0 评论 -
hdu 4003 Find Metal Mineral
题目大意:一些节点之间有道路相连,所有的节点和道路形成了一棵树。一共有 n 个节点,这些节点被编号为 1~n 。人类将 k 个机器人送上了火星,目的是采集这些金属。这些机器人都被送到了一个指定的着落点, S 号节点。每个机器人在着落之后,必须沿着道路行走。当机器人到达一个节点时,它会采集这个节点蕴藏的所有金属矿。当机器人完成自己的任务之后,可以从任意一个节点返回地球。当然,回到地球的机器人原创 2015-04-20 17:43:06 · 459 阅读 · 0 评论 -
hdu 4044 GeoDefense
题目大意:题干很长很吓人;这是一个塔防游戏。你的基地是一颗树的叶子结点,1为树根,从树根会跑出很多怪物,每个怪物都有一个血量,你可以在所有结点安装炮台,但是炮台对怪物只能打以炮,每个结点只能安装一个炮台,炮台有很多种类供你选择,每个炮台都有一定的花费和价值;问保证基地不被破坏的情况下,可以打掉的怪物的最大血量为多少;解题思路:一道比较复杂树形背包;首先我们得预处理数据,对于原创 2015-04-21 12:29:34 · 512 阅读 · 0 评论 -
poj 2486
题目大意:一个人喜欢吃苹果,一个树上的结点都放这苹果,但是这个人最多只能走m步,问走m步可以吃的苹果最多是多少?解题思路:这道题目和普通的树形背包有点区别,访问每个结点是按步数算的,这样,访问了子孙结点还可能返回来,也有可能不回来,我们可以多增加一维来处理这样的情况;dp[i][j][1]表示从i出发最后停留在i的直接相连的子孙或者i;dp[i][j][0]表示从i出发既没有停原创 2015-04-20 18:08:39 · 484 阅读 · 0 评论 -
poj 3345 Bribing FIPA
题目大意:所有的城市构成一片森林,你想竞选一个职位,就要获得m个城市的支持,你必须去贿赂这m个城市,但是如果以一个城市为根,它有子孙城市,那么你直接贿赂根城市,就不用贿赂它的子孙城市了,问要得到m个支持,至少需要贿赂多少钱;解题思路:因为是一片森林,我们先将森林转化为树,把没有父亲结点的结点都与0结点相连接;树形背包,将不同的子孙结点当做不同组别物品,m当做容量,代码中把size【原创 2015-04-21 12:12:53 · 498 阅读 · 0 评论 -
hdu 1011 Starship Troopers
题目大意:有一些山洞连接在一起,每一个山洞有一些bug和价值,你有m个战士,每个战士可以消灭20个bug,从1山洞出发,要消灭后面的必须消灭前面的,问,最多可以获得多少价值;解题思路:树形背包dp,一个结点的子孙结点就是分组的背包,可以选可以不选;dp[i][j]表示从i结点出发,放出j个士兵可以获得的最大的价值;转移方程为dp[i][j+k]=max(dp[i][j+k],d原创 2015-04-18 15:48:04 · 393 阅读 · 0 评论 -
poj 1155 TELE
题目大意:电视台要给用户发送信号,要通过转送站转送,转送的路径都要花费一定的金额,然后用户会交一定的费用接收信号,问在不陪钱的情况下最多可以让多少用户接收信号;解题思路:我们可以构建一棵树,用户则为树叶,电视台为根,中转站为非叶结点;dp[i][j]表示以i为根,发送给j个用户可以获得的最大的价值;初始化:dp[i][0]=0,dp[n-m+1''''''''''''''n][原创 2015-04-18 14:20:54 · 384 阅读 · 0 评论 -
poj 1741 Tree 树的分治
题目大意:求树上俩结点之间距离小于K的结点对个数;解题思路:俩个点a,b的公共祖先为c,那么这俩个点的距离就可以用dis(a,c)+dis(b,c)表示,我们可以不断的处理这样c,然后计算距离,处理点对,为了使平均性能最好,我们需要找的c为每一棵子树的重心;需要注意的算点对的时候这种方法成立的条件是俩个点不在同一颗子树上,因此我们算完以后还需要减去在一个子树的点对;然后解释一下代码原创 2015-04-17 10:42:34 · 431 阅读 · 0 评论