
树形DP
文章平均质量分 77
围巾的ACM
啊啊什么时候也能成为一个大牛啊
展开
-
HDU 2196 Computer(树的直径)
题意:给你一个树,求任意点对的最长距离思路:首先任意选取一个点求一次DFS求出树上直径的一个端点,然后以该端点再一次DFS求出另一个树直径端点,然后再以该端点为起点DFS一波,每次都更新d数组。原理:树上任意某个节点到树上任意节点的最远距离的端点一定会是树上直径的两个端点之一#include #include #include #include #include #i原创 2016-04-02 22:47:14 · 703 阅读 · 0 评论 -
UVALive 6619 LIKE vs CANDLE(树形DP)
思路: 树形dp。因为最终答案要求的是差值,所以对于每个节点我们只需要考虑差值即可,dp[u][0]表示u节点以下(含u)中like的val比candle的val大的最大值,dp[u][1]表示candle的val值比like大的最大值。所以,对于每个节点我们就可以对于每个子树v: dp[u][0] += dp[v][0];原创 2016-07-30 23:19:19 · 391 阅读 · 0 评论 -
Codeforces Round #358 (Div. 2) C Alyona and the Tree(树形DP)
思路:可以知道的是如果u这个结点删除,那么以u为根的子树也要删除,另外注意的是这个不开心值不一定要从根节点开始计算的,然后DFS一波就好了#includeusing namespace std;#define LL long longconst int maxn = 1e5+7;int a[maxn];vector >e[maxn];int ans;void dfs(in原创 2016-07-02 14:29:51 · 448 阅读 · 0 评论 -
hdu 5682 zxa and leaf(树形DP+二分)
思路:二分答案之后,树形dp去跑每个节点的取值范围就好了#includeusing namespace std;const int maxn = 5e4+6;int w[maxn],n,k,l[maxn],r[maxn],vis[maxn];vectorE[maxn];int dfsl(int x,int d){ for(int i=0;i<E[x].size();原创 2016-05-17 21:14:47 · 423 阅读 · 0 评论 -
hdu1011Starship Troopers(树形背包)
题意:有n个洞组成一棵树,你有m个士兵,你从1号房间开始攻打,每个洞有a个"bugs"和b的价值。你的一个士兵可以打20个"bugs",为了拿到这个洞的价值b你必须留下k个士兵消灭这个洞的所有"bugs"(k*20>="bugs"的数量,且留下的士兵不可以再去攻打其他的洞,且必须攻打了前面的洞才可以攻打后面的洞)。问你花费这m个士兵可以得到的最大价值是多少。 思路:树形DP入门..原创 2016-04-13 20:03:17 · 476 阅读 · 0 评论 -
CodeForces 219D Choosing Capital for Treeland(树形DP)
题意:一个国家有n个点,由单向边连接,现在要改变一些点到其所能到达的所有点的方向,问怎么改最小,并且输出那些点思路:显然的对于某个结点,考虑的就是以它为根的子树和它的父节点要改变的数目,我们可以首先以点1作为这棵树的根结点,那么对于它来说dp[1]是已经决定的了,那么再又dp[1]递推到下面的子节点,这个过程就完成了#include #include #include #in原创 2016-04-03 23:52:58 · 1015 阅读 · 0 评论 -
HDU 3586 Information Disturbing(树形DP)
题意:给出n个士兵,其中1号为指挥官,关系为树状结构,叶子为先锋,现在要在总花费小于m的情况切断所有的先锋与指挥官的联系,问最大的限制最小为多少思路:最大值最小的问题..显然二分,然后对于每一个值,树形DP判定是否可行,dp[i]表示要切断以i为根的其它所有子树的最小代价。其中设定叶子结点的代价为无穷大,那么对于某一个非叶子结点,要切断一棵子树就有两种选择,切断以孩子为根的子树或者切断根与孩子原创 2016-04-04 12:11:05 · 335 阅读 · 0 评论 -
POJ 3107 Godfather(树形DP)
题意:给定一棵无根树,删除树中一个节点,使得剩下各子树的包含的节点数最大值最小,问树中有多少个这样的节点?思路:用一个tot[]数组记录下每个点有多少个子节点,那么我们要求的删除根节点u后剩余部分的最大数就是要么是u的子树中的最大值,要么是除去以u为根的树外的剩余结点数dp[u]=max(max(tot[v]),n-cnt[u]);注意:会卡STL....#include #原创 2016-04-04 17:10:10 · 321 阅读 · 0 评论 -
Poj 2378 Tree Cutting (树形DP)
题意:给定一棵无向树,问删除那些节点可以使得新图中的每一个连通分支的节点数都不超过小于n/2。思路:和上一题差不多,也是分别考虑以u为根的子树和另一部分然后DP一波就好了#include #include #include #include #include #include #include #include #include #include #includ原创 2016-04-04 19:22:46 · 547 阅读 · 0 评论 -
POJ 1655 Balancing Act(树形DP)
思路:和POJ3107几乎一样...忘记把ans归0了 WA一次...#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;#define原创 2016-04-04 19:36:59 · 393 阅读 · 0 评论 -
POJ 3140 Contestants Division(树形DP)
题意:给一颗无向树,问删除某一条边后两个连通分支的最小差异值思路:也是和前几题差不多的思路..直接DFS一波就可以了...#include #include #include #include #include #include #include #include #include #include #include #include #include #原创 2016-04-04 19:58:00 · 329 阅读 · 0 评论 -
51nod 1405 树的距离之和(DP)
思路:观察一下样例可以知道,其实距离之和就是以某个结点为根结点时候所有子结点的深度之和,我们先DFS维护一下以1为根结点的情况下,已x为子树根结点的结点个数(包括自己),那么我们就可以预先求出来以1为根结点时候的答案,记为dp[1]那么已知dp[1]的情况下,怎么求dp[son]呢,随手画一棵树就知道,dp[son]=dp[root]-num[son]+(n-num[son])-num[s原创 2017-01-24 13:46:57 · 473 阅读 · 0 评论