树形DP
文章平均质量分 74
九野的博客
这个作者很懒,什么都没留下…
展开
-
HDU 4340
如题,一个比较裸的dp注意dp的过程是从叶子节点开始向根节点dp还有一个注意点是加边的过程难点应该还是状态转移方程#include #include #include #include using namespace std;#define N 105#define INF 1<<30int dp[N][2][2];//dp[i][j][k] k=0代表i点边上有用j原创 2013-07-24 21:51:07 · 1429 阅读 · 0 评论 -
POJ 1947 树形背包
题意:给定n个节点的无向树,删边得到一个K节点的子树。问:最少需要删几条边。第一行给定n,K(第二行给出 u v 表示 u是v的父节点 思路:树形背包dp[i][j] 表示以i为根的子树中 删边得到j个节点的子树需要删边数量。 对于一个节点i,先计算出i所有子节点的答案。初始化dp[i][1]为子节点个数,意思是删掉所有子节点。则加入子树v后会少删一原创 2014-02-23 10:55:48 · 1499 阅读 · 0 评论 -
SGU 143 树形dp 求联通块的最大权
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=143题意:给定n个点下面每个点权值(下标从1开始)无向树 问一个联通块的最大权值是多少(必须有点)#include#includeinline int Max(int a,int b){return a>b?a:b;}#define N 16010原创 2013-11-19 19:09:00 · 2663 阅读 · 2 评论 -
UVA 12452 Plants vs. Zombies HD SP 树形dp(水
题目链接:点击打开链接题意:给定n个点的树[0,n)开始所有边都是无色。有3种操作:1、选一个点染其相连的边 花费1002、选一个点染其相连的2条边 花费1753、选一个点染其相连的所有边 花费500问:染完所有边的最小花费。边可以重复染,点只能被操作一次。#include #include #include #include #include #原创 2014-11-27 00:07:39 · 1958 阅读 · 0 评论 -
Codeforces 490F Treeland Tour 树上的最长上升子序列
题目链接:点击打开链接题意:给定n个点的树。下面n个数表示点权。下面n-1行给出树。找一条链,然后找出这条链中的点权组成的最长上升子序列。求:最长上升子序列的长度。思路:首先是维护一条链然后求答案,但是如果直接树形dp(记录每个点u,u往下递增和u往下递减的长度)会使序列是来回的,即递增和递减都在同一条链上。枚举每个点作为子序列的开头,然后维护一条链进行LIS的原创 2014-12-22 00:02:15 · 2525 阅读 · 0 评论 -
UVA 11174 Stand in a Line 树形dp+计数
题目链接:点击打开链接题意:白书的P103.加个虚根就可以了。。。然后就是一个多重集排列。import java.io.PrintWriter;import java.util.ArrayList;import java.util.Scanner;public class Main { static int N = 40100; ArrayList[] G = new Ar原创 2014-12-23 00:01:47 · 1567 阅读 · 0 评论 -
UVA 10859 Placing Lampposts 树形dp(水
题目链接:题意:白书P70思路:简单题,每个点分放或不放。import java.io.PrintWriter;import java.util.ArrayList;import java.util.Scanner;public class Main { int min(int a,int b){return a>b?b:a;} int max(int a,int原创 2014-12-23 21:03:40 · 1106 阅读 · 0 评论 -
Codeforces 486D Valid Sets 树形dp+计数
题目链接:点击打开链接题意:给定常数d 和 n,表示n个点的树,每个点有点权问:有多少个点集使得点集中的点两两可达且最大点权-最小点权思路:对于每个点,计算包含这个点且这个点作为点集中的最小点权时的个数,枚举每个点。import java.io.PrintWriter;import java.text.DecimalFormat;import java.util.Array原创 2015-02-04 18:36:44 · 1193 阅读 · 0 评论 -
CodeForces 158E Phone Talks 树形dp+计数
题目链接:点击打开链接题意:给定n个点的树,常数d给出每个点的权值,问有多少种划分方法使得划分后每个连通块里的最大权值-最小权值思路:点击打开链接枚举每个点i 使得i是集合中的最小值。则枚举时已经使得i是最小值,然后这个问题就变成单纯的划分问题了,上面链接里的题解已经很详尽了import java.io.PrintWriter;import java.text.Decim原创 2015-02-07 20:30:13 · 1116 阅读 · 0 评论 -
POJ 3123 Ticket to Ride 状压dp+树形dp 斯坦纳树
题目链接:点击打开链接题意:给定n个城市和m条可选择修建的道路下面n行给出每个城市的名字下面m行给出每条道路及修建该道路的花费。下面4行,每行给出一对城市。目标:使得最后4行的每对城市连通(不同对之间可以不连通)所需要修建的最小花费。数据保证存在可行解思路:首先如果这个问题问的是所有城市都连通,就是一个最小生成树的问题。这里就相当于多个最小生成树的 问题。原创 2015-02-12 15:45:12 · 2254 阅读 · 0 评论 -
Codeforces 212E IT Restaurants 树形dp(水
题目链接:点击打开链接题意:给定n个点的树,染两种颜色,不同颜色不能相邻且要给尽可能多的节点染色。求颜色A和颜色B可能的染色节点个数。(copy from figo)而且至少一个点染A,至少一个点染Bdp[i][j]=1表示i点染j个A色是可行的 =0表示不可行。import java.io.BufferedReader;import java.io.Inpu原创 2015-03-21 15:06:58 · 1220 阅读 · 0 评论 -
Codeforces 294E Shaass the Great 树形dp(水
题目链接:点击打开链接题意:给定n个点的树,任意拆掉一条边,得到2个子树,再用刚拆掉的边把这两个子树连起来。得到新的树,这个树的权值为任意两个点间的距离和。使得新的树权值最小。输出这个权值。枚举拆掉的边(u,v)得到2个以u为根的子树和以v为根的子树计算每条边对答案的贡献,拆掉的边贡献就是siz[u]*siz[v]*edge[u,v].dis剩下的就是计算如何连接2原创 2015-03-21 10:32:56 · 1413 阅读 · 0 评论 -
CodeForces 238C World Eater Brothers 树形dp
题目链接:点击打开链接题意:给定n个点的有向树下面n-1行给出正向的边。问:修改尽可能小的边的方向,可以任选2个起点使得这两个点bfs能遍历完所有点。思路:枚举一条边,把树分成两部分,每次计算这两部分的最小花费。那么这样就变成一个子树上的dp。对于一棵树所需要修改的最小边方向的方法:首先容易求出:dp[i]表示以i为根的子树,用i作为起点的花费.我们选根原创 2015-03-11 16:52:58 · 1615 阅读 · 0 评论 -
Codeforces 543D Road Improvement 树形dp
题目链接:点击打开链接题意:给定n个点的树问:对于以i为根时,把树边黑白染色,使得任意点走到根的路径上不超过一条黑边,输出染色的方案数(mod 1e9+7)思路:显然i点的方案数 = i为根的子树的方案数 * 不包括i为根的子树的部分的方案数首先以i为根的子树求一个方案数down[i]:for all son vj of i, down[i] = multiply d原创 2015-05-09 21:26:12 · 1568 阅读 · 0 评论 -
HDU 5290 Bombing plan 树形dp
题目链接题意给定n个点的树,每个点有一个点权wi, 每次选一个点u,则树上u和距离u wi范围内的所有点都会被染色。问:最少选几个点使得n个点都被染色。思路:树形dp对于某个点udown[u][j] 表示u以及u向下深度为 j 的点没有被染色的最小花费。up[u][j] 表示u以及u向上距离为j的点已经被染色的最小花费。设u点的儿原创 2015-07-27 16:39:05 · 1655 阅读 · 0 评论 -
hdu 5379 Mahjong tree 树形dp
链接题意:给定一棵树把1-n填到树的节点上,使得:1:儿子节点上填的数字是连续的。2:子树节点上填的数字是连续的。把儿子节点分成两种,一种是叶子节点,一种是非叶子节点。显然非叶子节点个数不能超过2个,不然就不存在这样的方案了。然后分类讨论一下非叶子节点个数即可。#pragma comment(linker, "/STACK:102400000,1024000原创 2015-08-11 20:43:53 · 1169 阅读 · 0 评论 -
Codeforces 462D Appleman and Tree 树形dp
题目链接:点击打开链接#include #include #include #include #include using namespace std;#define N 300100#define mod 1000000007typedef long long ll;ll dp[N][2]; //dp[i][1]表示i点已经归属于某个黑点的方法数//dp[i][原创 2014-08-30 21:57:03 · 1727 阅读 · 0 评论 -
Uva 12587 Reduce the Maintenance Cost 边双连通+树形dp+贪心
题目链接:点击打开链接题意:给定n个点m条边的无向图下面n个数表示每个点的权值。下面m条边 (u,v) dis对于每条边,这条边的权值为 原图上删除这条边后,有N对点被分离, 则点权为 N*dis然后:让边两端任意一个点的点权上 加上这条边的权值使得:最大的点权最小。问:最小的答案。思路:1原创 2014-10-31 23:58:41 · 1620 阅读 · 0 评论 -
HDU 4340 Capturing a country 2012 Multi-University Training Contest 5
纪念一下九野先森终于摆脱苦逼的VC++6.0,改换2012的1A水题给定N,M 代表N个点 M个士兵,The following N lines indicate 攻占该点需要的士兵数(1个士兵能扣它20血。。)还有打败后能获得的brain值,next following N-1 lines indicate 点的连通(是无向边) 也就是一棵树从1开始进攻,(1是根节点)想要攻打子节点必须原创 2013-07-24 21:49:42 · 1254 阅读 · 0 评论 -
POJ 1655 树的重心
gx巨巨的题意:此题要求我们求一棵树的重心。给定一棵N个结点的树,求该树的所有重心。重心的定义如下:删掉某结点i后,若剩余k个连通分量,那么定义d(i)为这些连通分量中结点数的最大值。所谓重心,就是使得d(i)最小的结点i。算法分析:建图;树的基本操作:以结点1为根,计算出每个结点所在的子树的结点数。枚举每一个结点,若将其删掉,那么考虑剩余的所有连通分量。1原创 2013-11-20 22:19:37 · 1988 阅读 · 0 评论 -
SGU 134 树的重心
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=134134. Centroidtime limit per test: 0.5 sec. memory limit per test: 4096 KBYou are given an undirected connected graph, wi原创 2013-11-20 22:35:10 · 1840 阅读 · 1 评论 -
POJ 3417 删边求不连通方法 LCA转RMQ+树型dp
题意:n个点m条无向边下面n-1行给定原树m行给定新边 问删一条老边和新边使得图不连通的方法 首先,对于一条新边(u,v),加入后 成环 u, v, LCA(u,v)所以删除新边(a,b)以及这个环上的没有被其他环覆盖的边 即可分成两部分。所以问题转化为求每条边被环覆盖的次数 设dp[x]表示x所在的父边被覆盖的次数 引进一条新边(a,原创 2013-11-12 22:09:05 · 2491 阅读 · 0 评论 -
HDU 4118 树型dp 求树中每个点移位所需总 最小路径和
题意:T个测试案例n个点下面为一棵带权树问:每个点上站一个人,每个人都走到另一个点上,需要的 总路径和最小 输出这样的路径和思路:(百度借的)ans = Σ (每条路长 l )*(经过这条路的最大次数 f )f = 2 * 这条边左边节点数和右边节点数最小值k. (这样左边的每一个点一定能够对应右边的某个点)这个k可以dfs 求得. #pragma co原创 2013-11-21 20:27:12 · 1756 阅读 · 0 评论 -
HDU 3899 求所有人移动到某点的最小距离和 树形dp
题意:给定n个点每个点的人数n-1条边和边权。选取任意一点u,然后让所有人都移动到u点问最小的移动距离和是多少水dp#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include#include#include#include#includeusing namespace st原创 2014-05-01 18:24:34 · 1772 阅读 · 0 评论 -
2014百度之星初赛第一场部分题解
代码太丑就不贴了,,又是一篇无责任民科的题解。。HDU 4828 Grids看了一下跟卡特兰数差不多就猜了一下,具体为啥我也不知道。。然后有除法套个逆元。。HDU 4830 Party发现这个除了叶子节点可能是环,剩下就是一棵树了(如果是单独的环,就用虚拟节点0来连接一下)剩下就是环状树形dp。。原创 2014-05-24 20:58:22 · 2539 阅读 · 0 评论 -
Codeforce 337D 容斥+树形dp
题意:给定n个点的树 m个点中有小怪物 距离lm个点 表示该点有小怪物n-1表示树有一个u点存在大怪物,会把距离u点 告诉那些v点, 问所有可能的u点个数即:问树中 距离M点集 思路: #include #include #include #include #include #include #include #include原创 2013-12-21 14:01:39 · 1787 阅读 · 0 评论 -
ZOJ 3626 Treasure Hunt I 树形背包
题意:给定一颗无向树和点权值,问遍历树day次能得到的最大权n表示n个结点,下面一行表示所有点的权值下面n-1行给出边和边的花费最后一行给出起点和day一个树形dp 状态转移:dp[x][j]=Max( dp[v][k] + dp[x][ j-dis[x][v]-k ] , dp[ x ][ j ] );#include#include#原创 2013-08-14 09:13:58 · 1499 阅读 · 0 评论 -
HDU 4008 Parent and son LCA+树形dp
题意:给定case数给定n个点的树,m个询问下面n-1行给出树边m个询问 x y问:以x为根,y子树下 y的最小点标的儿子节点 和子孙节点思路:用son[u][0] 表示u的最小儿子 son[u][2] 表示u的次小儿子son[u][1] 表示u的最小子孙若lca(x,y) !=y 则就是上述的答案若lca(x,y) == y1、y != 1 那么最原创 2014-07-08 11:27:05 · 1795 阅读 · 0 评论 -
Codeforces 77C 树形dp + 贪心
题目链接:点击打开链接题意:给定n个点,每个点的豆子数量下面是一棵树再给出起点每走到一个点,就会把那个点的豆子吃掉一颗。问:回到起点最多能吃掉多少颗豆子思路:树形dp对于当前节点u,先把子节点v都走一次。然后再往返于(u,v) 之间,直到u点没有豆子或者v点没有豆子。dp[u] 表示u点的最大值。a[u] 是u点剩下的豆子数。#inc原创 2014-08-15 16:44:44 · 1378 阅读 · 0 评论 -
HDU 4035 Maze 概率dp+树形dp
题解:点击打开链接#include #include #include #include #include #include #include using namespace std;const double eps = 1e-9;const int N = 10010;vector G[N];int n;double k[N], e[N], dp[N];do原创 2014-10-21 14:22:36 · 1244 阅读 · 0 评论 -
HDU 4126 Genghis Khan the Conqueror MST+树形dp
题意:给定n个点m条边的无向图。下面m行给出边和边权下面Q个询问。Q行每行给出一条边(一定是m条边中的一条)表示修改边权。(数据保证修改后的边权比原先的边权大)问:修改后的最小生成树的权值是多少。每个询问互相独立(即每次询问都是对于原图修改)保证没有重边。求:所有修改后的最小生成树权值的平均值。思路:首先跑一个最小生成树。求得这个MST的原创 2014-11-09 16:42:32 · 1168 阅读 · 0 评论 -
HDU 4303 Hourai Jeweled 树形dp 所有路径点权和 dfs2次
题意:long long ans = 0;for(int i = 1; i for(int j = i+1; j ans += F(i,j);F(i,j)表示i点到j点路径上所有的点权和。若i->j路径上存在2条相邻边边权相同则 F(i,j) = 0问:ans的值。int乘法爆掉了我也醉了。。。思路:和网上的统计边方法不同,这里是用统计点出现原创 2014-10-01 22:25:02 · 1746 阅读 · 0 评论 -
HDU 4313 Matrix 树形dp
题意:给定n个点的树,m个黑点下面n-1行给出边和删除这条边的费用下面m个黑点的点标[0,n-1]删除一些边使得任意2个黑点都不连通。问删除的最小花费。思路:树形dp每个点有2个状态,成为黑点或白点。若本身这个点就是黑点那么只有黑点一种状态。否则可以认为是子树中某个黑点转移上来。所以dp[i][0]是i点为黑点的状态。#pragma comm原创 2014-10-02 17:54:01 · 1450 阅读 · 0 评论