
树形DP
文章平均质量分 80
cscoder
这个作者很懒,什么都没留下…
展开
-
hduoj 1561 The more, The Better
The more, The Better树形DP题目。树形DP+多重背包问题。由于初始化的原因,wrong了几次。方程很好写。我们先增加一个额外的节点0,同时将对应的攻克的城堡数目+1.方程如下:dp[r][j] = max(dp[r][j] , dp[r][j-k] + dp[u][k])其中u是r的儿子节点.#include #include #include #includ原创 2012-08-07 16:28:04 · 612 阅读 · 0 评论 -
ZOJ 3201 Tree of Tree
Tree of Tree简单Tree DP. 求一个含有k个节点的子树,使得子树上所有节点的权值和最大。方程:dp[i][j] 表示以i为根的子树中选取j个点所能获得最大值,其中i点必须选,然后就是直接使用分组背包就可以了。/* *author : csuchenan *Prog : ZOJ 3201 *Algorithm : Tree DP dp[i][j] 以i为原创 2012-10-04 23:01:50 · 453 阅读 · 0 评论 -
hdu 2242 考研路茫茫——空调教室
考研路茫茫——空调教室非常好的一个题。这个题目与hdu 3298很相似,都是求分成两个连通块之后,差值最小。不过这个题目的难点在于给的不是一棵树,而是一个图有回路存在。由于只能切断一条边,所以这条边对于这个图来说,一定是割边。那么问题就变得容易的多了,枚举每条割边,算出割边去除后两个连通分量的权值和之差。如何快速计算出每个连通块的权值和。我们可以在找割边的时候,就算出每个点的子节点的权原创 2012-10-19 13:17:44 · 1538 阅读 · 0 评论 -
POJ 3107 Godfather
Godfather树形DP简单题,就是找到这样的点:删除该点后最大的连通子树所包含的节点个数最小。然后将这些点依次输出。dp[i] = max{dp[j] , n-number} , j是i的儿子节点,number是i所在子树的总结点个数。#include #include #include #define maxn 50005using std::vector ;int n原创 2012-10-19 12:20:15 · 452 阅读 · 0 评论 -
POJ 1192最优连通子集
最优连通子集题目的描述太繁琐了。。。其实意思简单,就是给定若干个点,如果两个点之间的曼哈顿距离小于1,就连边。然后就构成一颗树,然后每个点都有一个权值,然后选取若干个点,使得权值和最大,并且点与点之前都连通。简单的树形DP,dp[i]表示以i点为根的子树并且选取i点时的最大权值。方程就很好写,dp[i]+=dp[u] ,其中u为i的儿子节点,并且dp[u]>0直接dfs一次,同时直原创 2012-10-19 12:47:16 · 614 阅读 · 0 评论 -
POJ 1770 Special Experiment
Special Experiment题目描述同POJ1192一样繁琐。。。意思很简单,如果两个原子的能量之差刚好是某个光子的能量,那么将会引起爆炸。。现在选取若干个原子,使得他们的能量之和最大,且不发生爆炸。建树方式:如果两个原子能量之差刚好是一个光子的能量,那么连边这样问题就变成了求最大独立集。方程就不在写了。。。具体看程序#include #include #include原创 2012-10-19 13:01:37 · 921 阅读 · 0 评论 -
HDU 1011 Starship Troopers
Starship Troopers树形DP+分组背包,根节点一定需要被攻占。dp[i][j] : 在i节点派j个机器人,能获得的最大概率。先不考虑根节点dp[i][j] = max{dp[i][j] , dp[i][j-k] + dp[u][k]} ,然后考虑i点也需要派兵攻占。。在判断一下就可了。具体参看程序/* * author : csuchenan原创 2012-10-19 12:05:27 · 434 阅读 · 0 评论 -
POJ 2378 Tree Cutting
Tree Cutting给一棵n个节点的无根树,问去掉哪个节点后可以使所有连通分支的节点数均,遇到小于等于n/2的,直接输出。。。#include #include #define maxn 10001int dp[maxn] ;int first[maxn] ;int next[maxn<<1] ;int edge[maxn<<1] ;int n ;inline原创 2012-10-19 12:36:56 · 390 阅读 · 0 评论 -
HDU 4276 The Ghost Blows Light
The Ghost Blows Light也是树形DP里非常不错的一道题。由于要从1走到N,我们可以先将从1到N的最短路给直接处理出来。然后由于我们可以在这条路上的一个节点走一个回路,已得到更大的价值。所以我们可以再对每个点进行一个分组背包。dp1[i][j]表示从i点出发回到i点用时j所能得到的最大价值。然后在进行一次分组背包dp2[i][j] i是关键路径上的点,表示从1走到i点用时j所能原创 2012-10-19 13:29:27 · 533 阅读 · 0 评论 -
POJ 1241 Knockout Tournament
Knockout TournamentTree DP 。很有意思的一个题目。给定了2^n个人每轮比赛的结果,然后推测每个人可能的最高排名与最低排名。由于给的是每轮比赛的结果,所以题目在数据的读入与处理方面比较麻烦。如果编号为i的人赢了编号为j的人,那么我们连有向边(i,j),即j为i的孩子。这样我们只需要处理出每轮比赛的两个人之间的关系即可。由于数据的最后一个肯定是树的根节点,然后我们从后往前原创 2012-10-04 23:16:32 · 683 阅读 · 0 评论 -
POJ 2486 Apple Tree
Apple Tree继续将树形DP题目给与整理。这个题目能很容易想到状态,dp[i][j]表示以i为根的子树中走j步所能获得的最大值。但是这样状态转移的时候比较难写,而状态转移比较麻烦的原因在于不能确定走到了哪一步。我们增加一维,dp[i][j][2],其中dp[i][j][0]表示要回到根节点,dp[i][j][1]表示不回到根节点。这样我们就很容易能得到状态转移方程了,很容易推出来,具体看原创 2012-10-02 22:47:27 · 411 阅读 · 0 评论 -
hdoj 3298 Contestants
Contestants树形DP题目,这个题目与hduoj4081以及金华邀请赛的power station (POJ 4045)比较相似。不过这个题目相对于后面两个要简单的多。我们可以先进行一遍DFS处理出以1为根节点的树的所有节点的子节点数目,然后就是求最小差值。枚举每条边,这里可以直接枚举点来进行。注意数据范围就可以了。#include #include #include #in原创 2012-08-07 18:43:15 · 727 阅读 · 0 评论 -
hdoj 4081
Qin Shi Huang's National Road System今天作比赛,做了这个题目,整个比赛中就只做了这一道= =。太弱了= = 。这个题目是最小生成树+树形DP。要求的是A/B , B是非特殊边的距离和,而A是特殊边两端城市的人口之和,由于要使得比值尽量的大,所以我们肯定距离要最短。我们可以首先求一下最小生成树,然后直接枚举每条边,去除该边后所能产生的最大比值。我们需要用一个数原创 2012-08-01 16:12:22 · 777 阅读 · 0 评论 -
POJ 4045 power station
POWER STATIONProblem B. Power Station Description The massive tsunami that struck the coastal city has washed away many ofinhabitants and facilities there. After the tsunami, t原创 2012-07-13 15:55:57 · 987 阅读 · 0 评论 -
hdu 4008 Parent and son
Parent and son树形DP题目。题目意思很简单,给定一个无根树,然后给定Q个查询x , y 查询以x为该无根树的根节点,然后查询y的最小儿子,以及中最小子孙。思路:首先我们规定树的根为1,然后进行一次dfs,求解出每个节点x的儿子节点中最小的和次小的,子孙节点中最小的,同时求出x的所有子节点保存的最小子孙节点中的次小子孙节点,以及每个节点x的父亲节点。数组含义如下原创 2012-08-27 21:45:00 · 1242 阅读 · 0 评论 -
hdu 4123 Bob’s Race 树形DP + 单调队列
Bob’s Race在昨天的模拟赛中,有一种情况没想明白,就没怎么写了。今天又想了一下,其实和hdu4008很像。然后重新写了一遍就AC了,看来树形DP的题目还得好好写写。说一下思路:分为求每个点出发的最长路和求最长区间两个阶段。关于求最长区间的可以直接采用单调队列,hdu3530便是一个求最长区间的问题。主要说一下求每个点的出发的最长路。求最长路:两个DFS. 第一次DFS,我们原创 2012-09-02 18:25:16 · 1091 阅读 · 0 评论 -
POJ 3345 Bribing FIPA
Bribing FIPATree DP。由于选定某棵子树的根之后,所有的子节点都被选择。我们先处理出不考虑树根的情况,选择j个点所需要的最小花费。然后对于每个j进行判断,如果对应的价值大于树根的价值,就更新。直接看代码:/* *author : csuchenan *PROG : POJ3345 *Algorithm : Tree DP dp[i][j]表示以i原创 2012-10-02 22:59:47 · 451 阅读 · 0 评论 -
POJ 1155 TELE
TELE这个题目搁置了好久才有重新拿过来做的。题目意思不难理解。TreeDP + 分组背包 方程: dp[i][j] = max{ dp[i][j] , dp[i][k] + dp[s][j-k] - edge[i][s]},其中s表示i的儿子节点,edge[i][s]表示i到s的边权,dp[i][j]从树根i的子树中选取j个叶子所需要的最小代价。不过这个题目比较卡时限,需要优化。由于叶子原创 2012-10-01 22:20:08 · 520 阅读 · 0 评论 -
POJ 3342 Party at Hali-Bula
Party at Hali-Bula好久没有写解题报告了,这次把上个月做的一些题都写写,上个月做了不少的树形DP,先从这个比较简单的入手。这个题目与hdu 1520 Anniversary party那道很裸的树形DP差不多,只不过这道题不仅要求出最多的人,还要判断是不是唯一。主要是如何判断人数是不是唯一的。出现多解的情况可能有如下两种,如果对于根节点而言,选与不选的解是相同的,则说明这样原创 2012-10-01 22:08:32 · 610 阅读 · 0 评论 -
Hdu 4303 Hourai Jeweled
Hourai Jeweled官方题解:从任意一点开始深搜,每颗子树搜索完毕之后向上返回pair每次深搜完一个子节点之后,增加的过这一点的gorgeous边的总分数为: 之前深搜的所有子节点向上返回的边数之和 * 当前子节点返回的分数 + 之前深搜的所有子节点向上返回的分数之和 * 当前子节点返回的边数 + 之前深搜的所有子节点向上返回的边数之和 *原创 2012-10-25 23:59:46 · 617 阅读 · 0 评论