
动态规划—树形dp
文章平均质量分 72
My_ACM_Dream
生活没有彩排每天都是现场直播
展开
-
hdu 5148 Cities(树形背包)
题意:给出一棵树,现在要选择k个点,要求这个k个点组成的路的平均值(即期望)要最小,路径的综合可以这样计算 :∑Ki=1∑Kj=1dis(vi,vj)题解:题目要求输出的是结果乘以k^2,那么这样就可以要求的其实就是∑Ki=1∑Kj=1dis(vi,vj)这个式子!ok,那么状态就可以设为:dp[i][j] 根节点i选择j个点得到的最小路径和。状态方程:dp原创 2014-12-22 11:08:58 · 663 阅读 · 0 评论 -
hdu2196(树形dp)
题意:给出一棵树,以及每个节点之间的距离,求每个节点能到达的最长距离,这里的树是广义上的树。题解:设置这样的状态dp[i][3]为什么,因为我们需要对树的儿子部分求最长路和父亲部分求最长路,那么0表示儿子的最长路,1表示儿子的次长路,2表示父亲的最长路。那么就可以两次搜索dp。代码附上注释了。#include#include#include#include#includ原创 2014-12-15 00:31:43 · 555 阅读 · 0 评论 -
codeforces 294E Shaass the Great (树形dp,好题)
题意:给出一棵树,每条边有一个权值,现在要将树的某个边打断,然后重新建一条等长的边在某两点间,要求建完边的图形也要是树。求使得所有点两两距离和最短的方案。题解:我们分析如果某条边打断,那么就分成了两棵树,我们假设断掉的是u,v两点的边,那么两两距离和可以化成这个公式:S = { u的树中任意两点距离和 }+{ v的树中任意两点的距离和 } + { u树中任意点到u的距离和 * v的原创 2015-02-15 11:49:36 · 819 阅读 · 0 评论 -
福建省2014ACM省赛H Big castle (树形dp)
题意:给出一棵树,然后每个节点有一个状态0或者1,当操作某个节点时,相邻的节点会反转。求能否通过操作使整个树的节点全部变成1.题解:开始的想法是dp[u][2] 1表示这个节点是亮的,0表示这个节点是暗的。发现很多状态无法确定,然后多加一维的状态,dp[u][2][2],第二维表示这个节点是否操作过。这个转移的思想就是保证儿子节点全部暗或者全部亮,然后判断这个节点原来亮暗状态然后进行状原创 2015-03-17 21:07:39 · 842 阅读 · 0 评论 -
UVA 1407 Caves (树形dp)
题意:有一颗树,树上的每条边有一个距离,一个人最多只能走W的路程,问这个人能走的最多的节点数是多少。每个测试实例有q个询问,每个询问给出一个W问对应能走的对打节点数。题解:这题显然不能用路程作为背包,反过来,用点数作为背包,路程作为价值,尽量让价值最小,首先用树形dp预处理出对应的最小价值,然后根据每个询问从节点大到小查找最大的节点数满足价值#include#include#i原创 2015-04-20 13:24:26 · 615 阅读 · 0 评论 -
UVA 1484 Alice and Bob's Trip (树形dp)
题意:Alice和Bob(又是这两个家伙)从树根出发,要走到叶子,Bob希望走长一点,Alice希望短一点,于是两个人轮流选取边去走,但是两个人选的边总和要在[L,R]之间。题解:dp[u][2],表示在根u时,0表示Bob选,1表示Alice选,能得到的最优解。#include#include#include#include#include#include#inclu原创 2015-04-20 21:17:31 · 506 阅读 · 0 评论 -
FJUTOJ 校赛J 第十集 原来这一切都是真的 (树形概率dp)
题意:有n个点组成的树,叶子节点是门,门有守卫的概率是这个点的编号/n,如果一个点连接的门的守卫个数或者路口的守卫个数时奇数那么这个点要设置一个守卫,问0也就是树根没有守卫的概率。题解:dp[u]表示树上节点u有守卫的概率,对于某个点u,以及儿子v,dp[u]=(1-dp[u])*dp[v]+dp[u]*(1-dp[v]),此时dp[u]可以表示在到v这个儿子为止守卫是奇数的概率(也就原创 2015-04-15 11:29:43 · 671 阅读 · 0 评论 -
UVA 12223 Moving to Nuremberg (树形dp)
题意:题目给出一颗n个点的树,一个人可以选择任意的位置作为开始点,然后去他喜欢的景点玩,每个景点要玩ni次,每次出去经过每个景点只能算一次,要回去之后再出来才能重新计数。但是每条边都有一个距离,现在问那些点能让他走的距离最短,出处距离和点。题解:这题要重根节点往子节点跟新,首先计算出最开始的根节点需要的距离,然后丛上往下跟新将起始点转移到子节点,对于某个父节点u,子节点v,如果把起始节原创 2015-04-20 17:40:05 · 765 阅读 · 0 评论 -
poj 1770 Special Experiment (树形dp)
题意:一个N个点的集合任取一些点,保证这些点任意两个相减不会等于集合M中的数,求这样的集合点的权值最大和。题解:这个类似点独立集,如果两个点相减能在M中找到就加一条边,最后就树形dp,有个小优化暴力枚举任意两个点内循环用二分判断是否在M中出现。#include#include#include#include#include#include#include#includ原创 2015-04-20 22:55:23 · 572 阅读 · 0 评论 -
codeforces 23E Tree (树形dp)
题意:给出一棵树,求删除某些边使得树剩下的联通分量对应的定点数乘积最大。题解:dp[u][j]表示u为根的子树有j个节点能得到对应分成的联通分量点乘积的最大值。这题只能用大数做,java写了下大数,各种wa。可能方程错了,用的是背包。import java.util.*;import java.math.*;import java.io.*;public cla原创 2015-02-15 20:37:04 · 793 阅读 · 0 评论 -
FZU 2195 检查站点 (树形dp)
题意:在山上一共有N个站点需要检查,检查员从山顶出发去各个站点进行检查,各个站点间有且仅有一条通路,检查员下山前往站点时比较轻松,而上山时却需要额外的时间,问最后检查员检查完所有站点时所需要的额外时间最少是多少。题解:dp[u][2],表示以u为节点的子树,0表示回来,1表示不会来。#pragma comment(linker, "/STACK:102400000,10240000原创 2015-05-03 21:39:49 · 600 阅读 · 0 评论 -
poj 1947 Rebuilding Roads (树形dp)
题意说给你一棵树,问得到点数为p的子树至少要删除多少条边。状态方程:好好理解下状态方程。/*---------------------------------------------------------------------| u的子树v || 1原创 2014-12-01 17:46:55 · 505 阅读 · 0 评论 -
codeforces 461B Appleman and Tree (树形dp)
题意:给定n个点的树,0为根,下面n-1行表示每个点的父节点最后一行n个数 表示每个点的颜色,0为白色,1为黑色。把树分成若干个联通块使得每个联通块有且仅有一个黑点,问有多少种分法(结果mod1e9+7)题解:状态dp[i][2] 1表示这个点在内子树归属于黑点了,0表示不归属。方程:dp[u][1] = dp[u][1] * dp[v][0] + dp[u][1] * d原创 2015-02-03 13:47:47 · 687 阅读 · 0 评论 -
Codeforces 219D - Choosing Capital for Treeland(树形dp)
题意:给出一棵树,找出这样的点:这个点通过反转边的反向达到其他各个点,并且反转次数最少。同时要输出最少的反转次数。题解:两次搜索。dp[i][2] 0表示第一次搜索这个点要到其他点需反转的最小次数,1表示第二次。状态转移:if(val==0) dp[u][1]=dp[fa][1]+1; else dp[u][1]=dp[fa][1]-1;#include#i原创 2014-12-17 18:42:47 · 1216 阅读 · 0 评论 -
codeforces 274B Zero Tree(树形dp)
题意:给出一棵树,然后每个节点有个值vi,每次操作包含1这个节点的子树,操作内容是这颗子树的所有节点+1或-1.问最小的操作数使得树各个点变成0.题解:dp[u][3] 0表示操作数,1表示子节点操作完这个节点还剩多少需要操作。每次都要累加dp[u][1]的值。2是个中间变量。可惜这样做事错的,明天再看看如何解决。wa的代码:#include#include原创 2015-02-03 22:20:33 · 999 阅读 · 0 评论 -
hdu 3586 Information Disturbing(树形dp)
题意:给出一棵树,1是根节点,问如果切断边(每个边都有权值)使得总权值小于一个上限up并且小于m,求这样的最小上限up。题解:分析这题 要求上限最小无非就是枚举上限(从1-最大边的权值),对于每个上限都dp一次。直接枚举肯定超时,用二分枚举降低复杂度。#include#include#include#include#includeusing namespace s原创 2014-12-19 01:00:15 · 572 阅读 · 0 评论 -
poj 3345 Bribing FIPA(树形dp)
题意:给出n个节点的一个森林,现在要选出至少m个节点,每个节点都有一个价值,如果选了树根对应的子树可以不用花费价值就可以选到,求最小的价值。题解:状态dp[i][j] i为根的树选j个节点的最小价值。整个就一背包,注意初始化就好。#include#include#include#include#include#includeusing namespace std;原创 2014-12-25 18:24:12 · 682 阅读 · 0 评论 -
hdu 1561 The more, The Better(树形dp)
题意:给出一颗树,树的根为0,占领每个节点都会获得一个价值,但是要得到某个子节点的价值必须先要占领这个子节点的直接前驱也就是父亲节点。问得到的最大价值是多少。题目给出最多能占领m个点。题解:树形背包(01)设置状态dp[i][j] 表示以i为根j个节点能得到的最大价值(这里的j可以表示不含根节点有也可以表示含有根节点)在转移时状态应该这样:dp[u][i] = max { d原创 2014-12-20 13:24:30 · 460 阅读 · 0 评论 -
hdu 1011 Starship Troopers(树形dp)
题意:给出一棵树,树上的每个节点都有一个价值,但是要获得这个价值就必须要派出对应多的人数,入口是点1,问得到的最大价值是什么。题解:树形背包(01),状态:dp[i][j] 表示根节点i有j个士兵能获得的最大的价值。 枚举孩子树中节点士兵的个数。#include#include#include#include#includeusing namespace std原创 2014-12-19 13:20:34 · 566 阅读 · 0 评论 -
poj 1947 Rebuilding Roads(树形dp)
题意:给出一棵树,问如何切割边使得剩下的子树的点个数为p,要求切割的变数要最好。题解:这题状态很明显:1、树的根;2、以某个点为根的子树的点的个数。那么状态dp[s][i] 以s为根,节点数为i的子树最小的切割边的个数。那么就有两种决策,要么切割,要么不切割。我们要以s为根的点数和子树的点数,那么对于一个k个点的子树v1.选择切割时:dp[s][i]=dp[s][i]原创 2014-12-20 10:24:57 · 478 阅读 · 0 评论 -
poj 2486 Apple Tree(树形背包)
题意:给出一棵树,树上每个节点都有对应数量的苹果,一个人可以从任何点出发,问如何让这个人在走k步以内得到最多的苹果。题解:分析发现,这题对于走树的路径是有往回走和不往回走的情况,并且注意到了可以重复走一条路多次。那么可以定义这样的状态 dp[root][j][st] 根节点root的树,走了j步状态为st时能得到的最大苹果数。st=0、1。 st=0 表示不回到root节点,st=原创 2014-12-23 01:05:01 · 576 阅读 · 0 评论 -
poj1655 Balancing Act(树形dp)
正如标题一样树形dp?感觉就想是搜索题。题目意思:题目要我们求某个点:以这个点为根结点的子树中顶点个数的最大值作为这个点的价值,那么找出价值最小的点,并且输出最小值,价值相等输出靠前的点。搜索有一点技巧。#include#include#include#include#include#include#include#include#include#include原创 2014-12-01 19:36:52 · 982 阅读 · 0 评论 -
poj 3170 Godfather(树形dp)
和poj1655一样#include#include#include#include#includeusing namespace std;typedef __int64 lld;#define oo 0x3f3f3f3f#define maxn 50005#define maxm 205int dp[maxn];struct EDGE{ int v,next;原创 2014-12-23 18:31:27 · 502 阅读 · 0 评论 -
poj 3140 Contestants Division(树形dp)
题意:给出一棵树,每个节点都有价值,问分割那条边能使得分割后的子树的节点价值和的差多小,求出这个最小的值。题解:这题说是树形dp,其实可以算是搜索题吧。定义dp[u]表示以u点为终点的边被割掉能得到的最小差值。sum[u]表示包含u这个点顺着往下子树中节点价值的总和。那么状态方程就出来了 当u==pre时 dp[u]=sum[u]-(allsum-sum[u]); alls原创 2014-12-24 13:45:47 · 600 阅读 · 0 评论 -
zoj 3626 Treasure Hunt I(树形背包)
题意:给出一棵树,每个点有一个价值,但是走每条边都要话一定的时间,问从起点k开始走,如何在m天内得到最大的价值并且要回到出发点。题解:这题明显背包,把路要走的天数作为容量,价值作为背包价值。dp[u][j]初始化dp[u][0]=val[u] 在u这个点时没花费任何时间就可以得到这个点的价值,这个是必然的。#include#include#include#include原创 2014-12-26 12:54:43 · 629 阅读 · 0 评论 -
hdu 4276 The Ghost Blows Light(Spfa+树形dp)
题意:一个盗墓者去盗墓,结果墓要倒塌了,现在他有T的时间从入口1到达出口n,每天路有需要一定时间才能走完,由于是去盗墓所以要多拿点财宝,每个点都有一定数量的财宝,于是问你这个人能不能到出去,如果能输出最多能拿多少财宝。题解:我们可以这样分析,对于这样的情况我们首先要保证一定能到达出口,那么先让最短路求出能到达出口的最短时间,那么现在分析第二点,如何拿到最大价值的财宝,那么我们可以这样想原创 2014-12-26 19:46:32 · 620 阅读 · 0 评论 -
hdu 5148 City (树形dp)
题意:在树中取k个点,这些点中任意点的距离和要最小。题解:dp[i][j],表示以i为跟的子树选择j个节点对应的距离对整体的贡献,就是一个树形背包。dp[u][j] = min { dp[u][j-t] + dp[v][t] + cost(t * (k-t) * w * 2) } cost是连接u和v的边对整体的贡献。 #include#include#include#i原创 2015-05-17 11:46:14 · 725 阅读 · 0 评论