动态规划-树形dp
ruclion
天上一日,地下十年
展开
-
恐怖分子炸桥
HDU - 4679题目描述:n~1e5个点的树,边的长度都是1,但是每一条边都有一个破坏的值,恐怖分子可以随便破坏一条边,剩下两棵书的直径的较大值*破坏边的值设为t,求所有的边中最小的t对应的id,如果一样的话输出较小的id题解:很综合的一道树形dp.首先是搞出来dia[u],以u为根的树的直径.然后需要求另一个的直径:我们这样定义:key[u]指将u的所有儿子都删掉,之后剩下的子树的直径.那么怎原创 2015-05-26 16:02:59 · 1115 阅读 · 0 评论 -
uva 12223 - Moving to Nuremberg
Moving to Nuremberg题目描述:给出n,表示有n个位置,n个位置有n-1条边,形成一个无根的树,每条边上都有权值。现在每个位置都有一个景点,一个人想在一年之内去ki次景点,所以接下来给出m,表示说在m个位置上有这个人想去的地方,给出位置以及想去的次数(注意,每去一个景点都要返回自己的住处),然后问说,这个人该住在哪里走的路程才最短。题解:常用的一种简单的树上枚举根的转移方法.第一次以原创 2015-06-08 10:01:09 · 351 阅读 · 0 评论 -
hdu1520
公司开会题目描述:公司的员工是一棵树,每个节点有一个值,要求在树中直接相邻有边的两个不能同时来,问最大的点中的权值和是多大题解:水题,dp[u][0/1],代表选该点和不选该点时的最大值,然后dp就好了.注意,在u不选的时候,下面的v可以选可以不选,找一个最大的就好了.重点:树形dp,多一位定状态.代码:#include <iostream>#include <cstdio>#include <原创 2015-06-07 16:48:26 · 331 阅读 · 0 评论 -
把树变成环
HDU - 4714题目描述:给出一棵树,n~1000000,每次拆除一条边花费1,添加一条边花费1,问变成环的最小花费.题解:变成环,其实一定是变成一条链然后加一条边变成环.那么怎么变成链呢?考虑最根的根节点,子树假设已经变成链了,发现子树的链有两种可能,顶底是链段,顶点不是链端,如果不是链段,一定要出来,如果是链段,可能可以不去掉.那么dp就有第二维标记了,0代表随便,只要变成链,1代表必须要求原创 2015-05-26 11:50:27 · 729 阅读 · 0 评论 -
bob的race
HUD4123 Bob’s Race题目描述:首先给出一棵树,n~5e4,然后要求求出每个点出发走不重复路径到达的最远的距离.之后,找出最长的连续的节点的长度,使得他们的之中最大值减去最小值小于等于给出的Q.一共问了M~500次Q.题解:完全分为两部分:先求出每个点最远到达长度.常用的树形dp.首先一次dp出节点u为根的dpm和dps,保证这两个没有相交的路径.之后再dfs出u,含义是u往上身的最长原创 2015-05-26 11:17:44 · 395 阅读 · 0 评论 -
算有几个简单路径对
HDU 4705题目描述:一棵树n~1e5,求出有多少个无序对(A,B,C),使得没有一个简单路径能够一笔画过ABC.题解:没有简单路径,不好弄.我们更熟悉的是简单路径.一笔带过,那么就是求出有几个简单路径的对数.简单路径3个点,一定要想到中间的那个点,枚举中间的那个点是谁,那么剩下的两个分别分布在岔路上,就是正常的横着dp.重点:一个转化,把非简单路径转化为简单路径,之后3个点枚举强制是中间的那个原创 2015-05-26 14:46:06 · 913 阅读 · 0 评论 -
UVA1407
一定距离走多远题目描述:给出n,表示有一个以0为根含有n个节点的树,每条边有一个权值,现在给出m次询问,每次询问有一个val值,要求计算在val值下的距离最多能经过多少个节点,一个节点多次移动多算一次.其中走的路程很大,点一共有500个题解:一共有两个重点.(1)点很少,距离很大,用dp的话要dp[u][i] = x,其中i是可以走的点的个数,而不是距离,用x来表示距离,这样之后扫一遍可以小于lim原创 2015-06-12 10:21:01 · 361 阅读 · 0 评论 -
多角度思考 创造性思维 --论文中的Chris家的电话铃响起了 题
题目描述:Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:“喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?”一听说要考试,Chris的父母就心急如焚,他们决定在尽量短的时间内找到Chris。他们告诉Chris的老师:“根据以往的经验,Chris现在必然躲在朋友Shermie或Yashiro家里偷玩《拳皇》游戏。现在,我们就从家出发去找Chris,一但找到,我们立原创 2015-06-12 17:06:12 · 525 阅读 · 0 评论 -
多角度思考 创造性思维 几乎整个Byteland王国都被森林和河流所覆盖 题
题目描述:几乎整个Byteland王国都被森林和河流所覆盖。小点的河汇聚到一起,形成了稍大点的河。就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海。这条大河的入海口处有一个村庄——名叫Bytetown。 在Byteland国,有n个伐木的村庄,这些村庄都座落在河边。目前在Bytetown,有一个巨大的伐木场,它处理着全国砍下的所有木料。 木料被砍下后,顺着河流而被运到Bytetow原创 2015-06-12 17:10:46 · 1794 阅读 · 0 评论 -
S国有一个山洞,它由n个房间和若干走廊组成。对于任意的两个房间,总有唯一的路径相连。A在这些房间中的一个藏了很多财宝,但是他不告诉B到底是哪一个房间 这题
没读懂题解啊= =原创 2015-06-12 17:11:58 · 777 阅读 · 0 评论 -
hdu5325 多校第三场1010
题目描述:给出一棵树,n~5e5, 每个点都有一个权值.找出点个数最多的这样的连. 链的要求是(1)链本身是联通的,中间不能够隔着没有选的点.(2)如果按照权值大小排序,我们看每一对相邻权值的点,ij,wi题解:主要是一道性质题. 解法一:树形dp的思维. 因为保证了连通性,所以可以这样做.我们看当前的小根节点u. 以u为中心向它的儿子扩展.儿子v. 下面是一个重要的性质:一个u连接的两个儿子v1原创 2015-08-01 23:14:27 · 405 阅读 · 0 评论 -
多校第一场 1003
炸弹题目描述:一个树,n~1e5个点,每个点有一个权值,表示可以如果炸掉它,就可以免费炸掉距离他小于等于w[i]的点.每个点的权值<=100; 问最少炸几个可以全部炸完.题解:首先是一个点有一定范围的树上的dp.以前做过的是可以开二维dp[i][j],i是被j点控制的,j不限于i的子树. 但是这道题不能开二维,但是因为权值小于等于100,所以 用g[i][j]表示i为根的子树,从外面获取了炸到i原创 2015-07-23 22:08:44 · 313 阅读 · 0 评论 -
多校第一场1006
题目描述:给出一棵树,n~1e5,然后给出m~1e5条特殊的链,每个链有一个权值.现在在树上挑选不相交的链,使得最后的拿到的权值最大.题解:看一个点,是树形dp,但是发现如果u是root,枚举过u的链,发现要暴力求和链上周围的点的dp和.这样会超时. 于是想到快速求一条链的和. 为了好写,我们把求链上连接的儿子的dp值的和转化到链上的权值. sum[u]指u的所有儿子的dp和,这个好想,那么一条原创 2015-07-23 22:31:43 · 310 阅读 · 0 评论 -
UVA - 11307
用数字染色题目描述:给出一棵树,然后在每个节点上填上任意的数字,要求相邻的节点不能填相同的数字,问说所有节点数字的和最小为多少题解:本来很简单,要全部染色的话其实2种颜色就够了,但是要求和最小.关键是发现2种颜色是不足以达到最小的.那么用几种呢?不知道…因此多用几种去试,6种其实就行,我觉得其实也不一定对…….多试几种重点:发现并不是2种颜色最好,举出反例就好,然后多用几种颜色.代码:原创 2015-06-08 09:48:46 · 340 阅读 · 0 评论 -
Codeforces 461B Appleman and Tree
每棵子树包含黑点题目描述:有n~ 1e5个顶点,一棵树,每个顶点是黑色或者白色,问一共有多少种切边的方法,使得切过后的每一部分都有且仅有一个黑色的点.保证至少有一个黑色的点.题解:首先画出递归版的一棵树,发现砍不砍uv这条边和v顶点本身的树是不是有黑色有关,并且之后的信息是不用管的,再结合算个数的分析.是树形dp.dp[u][0/1],0代表没有黑色,1代表有黑色.在横着dp的过程中,子树如果原创 2015-06-08 08:57:59 · 281 阅读 · 0 评论 -
uva1484
bob和alice题目描述:一棵树,bob想要尽量往远的走,alice想要尽量往近的走,并且他们约定走的距离必须是[l,r]内.问bob先走,alice后走,问最终会走到哪里题解:画出树,发现是递归的不用看具体的子树张什么样的,所以用树形dp.就是奇偶从子树中挑最大的和最小的.关键是:因为有[l,r]的限制,所以要一直有一个road跟踪值,来确保取得的最值是有效[l,r]中的最值,而不是当前u问根开原创 2015-06-08 09:16:15 · 222 阅读 · 0 评论 -
poj 1741
距离小于k的有多少个点对题目描述:给定n个节点组成的树,树有边权,现在给定一个点u和v,dis(u,v)表示u和v节点的最近距离,问dis(u,v)<=k的uv对数,n <= 1万,k不定,权值<=1000。题解:第一次从单纯的树形dp转到树的分治.dp的话基本上是从儿子们获取少量的信息,或者是父亲传给儿子们少量的信息.但是这道题需要很多的信息,并且每次从儿子合并到父亲的时候都要基本上是o(n)的时原创 2015-06-16 11:30:11 · 375 阅读 · 0 评论 -
Codeforces Round #135 (Div. 2) D Choosing Capital for Treeland
最小修改边题目描述:一棵树,然后每个边都有方向.从中选出来一个点,这个点往其他所有的点流动,不能流的边就改变边的方向.问所有点中最少的修改次数.要求o(n)题解:很简单的一个题,但是用到了树形dp常用的一个办法.先随便找一个点,跑一次.之后开始在树上转化,这个转化很简单,每次从父亲到儿子dfs中传一个儿子的值就好了,+1或者-1. 还做过一道两个点的,问最少修改次数.n^2就行.转化成这道题的话:原创 2015-06-16 11:52:53 · 541 阅读 · 0 评论 -
动态规划-树形dp总结
一.简单的从下到上和从上到下的统计1. dp[u]表示以u为根的一共有多少个节点.可以用来求重心.2. 每个点出发能够走得最远的长度.dpm[u], dps[u]用来保存u为根到子树的最长距离,注意两者区别是不同的儿子(不想交路径).另外有一个f[u]指的是去掉u的儿子们之后,u可以发出的最长链.这样的是一个规范的从上往下的dp.我是这样定的:定状态f[u]要求不能考虑原创 2015-06-17 17:02:56 · 2360 阅读 · 0 评论 -
树的平衡值
题目描述:树的顶点~20,000. 保证是一棵树,每个顶点的平衡值如下:去掉该点后,剩下的树顶点的最大值.求出给出树平衡值最小的顶点,如果一样,输出序号较小的.题解:树形dp.其实平衡值就是儿子的个数和父亲那里个数的较小值.重点:树形dp,统计子树个数经常用.代码:#include <iostream>#include <cstdio>#include <cstring>#include <s原创 2015-05-26 10:30:46 · 412 阅读 · 0 评论 -
poj 2152
消防站题目描述:有n个城市,每两个城市只有一条路连接,(所以可以当成是一颗树)。现在要建设一些防火站,使每个城市都可以被覆盖。每个城市的属性是:在本城市建防火站的价钱和不在本城市建设的话,所依赖的别的防火站的最长距离。然后是n-1条路,和这条路的长度。现在问在覆盖所有城市的前提下的最少价格。题解:很难的一道题,但是很巧妙.思维分好几个步骤:首先是题意的放松条件,我们不去追求真正的最近,因为兄弟节点会原创 2015-06-16 11:43:17 · 495 阅读 · 0 评论 -
最长直径有几个
HDU - 3534题目描述:给出一棵树,问最长的直径是多少,并且问个数题解:树形dp,关键这一次要计算个数.dp[u]表示长度,num[u]表示个数.那么往根u推的时候,要搞出:两条链分别是u的两个儿子上的和的最大值以及它的个数.这个需要:这样一定要是用动态规划来扫一遍算,枚举当前边是第二条边的话怎么怎么样.如果不是横着扫,会出很多问题,因为情况可以相交的和不可以相交的都统计在一块是不对的,因此一原创 2015-05-30 11:30:52 · 343 阅读 · 0 评论 -
Holiday's Accommodation
HDU 4118题目描述:一棵树,现在给出一个旅行规则:每个人本来有一个家,每个点对应一个人.现在他要去旅行,会选择某一个顶点作为他的家,最后要求每一个人都有一个家,没有两个人共用一个家.要使这些人的旅行路程之和最大,输出最大的路程之和.题解:思维题.同时也是树形dp常用的思维.枚举边,看这条边的贡献度.发现一条边,两边有两堆点,a,b,b较小,那么b的所有点一定可以过去到边的另一个,a的那边也会有原创 2015-05-30 11:41:43 · 562 阅读 · 0 评论 -
HDU 3586
HDU 3586题目描述:给定n个敌方据点,1为司令部,其他点各有一条边相连构成一棵树,每条边都有一个权值cost表示破坏这条边的费用,叶子节点为前线。现要切断前线和司令部的联系,每次切断边的费用不能超过上限limit,问切断所有前线与司令部联系所花费的总费用少于m时的最小limit。1<=n<=1000,1<=m<=100万题解:每次断边不能超过上限的limit,求最小的总花费,其实就是二分枚举l原创 2015-06-04 11:19:26 · 496 阅读 · 0 评论 -
HDU 4276
HDU 4276 The Ghost Blows Light题目描述:有一棵树,N~100,有时间T~500,起点是编号1,重点是给出的N,每个点有若干个宝,要求在时间内走到N出去,并且尽量拿到多的宝藏,输出最多宝藏数.题解:有个小技巧可以简化思维.一定要走的路先走一遍,并且不会反复走.这样先搞出,然后把路上的花费消除掉.之后就是正常的树形dp,加一维表示用了多少时间.而且保证在u的一定要回到u.重原创 2015-05-30 21:54:46 · 434 阅读 · 0 评论 -
HDU1011
消灭怪兽吃东西题目描述:给出一棵树树,每个节点有一些东西需要消灭,消灭后节点上有一个概率值,树形依赖,手中1个士兵可以消灭20个东西,但是一个士兵只能放在一个地方.问手上的士兵最多可以搞到的最大的概率题解:其实就是树形依赖背包.不知道为什么就是过不了…..重点:代码://////过不了的代码.....回头再看吧= =#include <iostream>#include <cstdio>#in原创 2015-06-06 11:52:30 · 487 阅读 · 0 评论 -
hdu2196
电脑题目描述:水题,一棵树,每个节点的最远距离题解:树形dp,先跑出来dpm和dps,然后再dfs,参数含fa的去掉儿子的len,之后比较找出当前u的结果以及u的去掉儿子的len,传下去重点:标准的u去掉儿子的len以及求u的最远距离代码:#include <iostream>#include <cstdio>#include <cstring>#include <string>#inclu原创 2015-06-07 16:38:29 · 441 阅读 · 0 评论 -
hdu 5148
分配城市题目描述:有2000个城市,是一棵树,树上的边有权值,要求选择k~50个城市,使得城市中所有两两的点的距离的总和最小.题解:树形dp,考虑用几个点在这棵树上,对于根节点,为了便于好写,强制要求必须选.那么如果能够搞出来,结果就是枚举所有的作为根节点然后取最小的ans,怎么搞呢?先用一种笨的方法:对于k,枚举给当前子树多少个,然后用更新值,这里有个关键点,当前u,子树v为根节点,给子树m个,那原创 2015-06-07 17:38:05 · 375 阅读 · 0 评论 -
2015Daejeon UVALive 7236 K - Tree Edit
题目描述:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=104527#problem/K题解:原始树 叫 1 上面的节点为i 目标树叫2 节点为jdp[i][j] 就是i节点和j节点到时候对应所花的目前的次数然后树形dp现在看dfs(i, j)怎么算 算出来的结果放到dp[i][j]中 设i的儿子a个 j b 个儿子, 那么我们原创 2016-01-21 22:30:10 · 330 阅读 · 0 评论