DP Intro - Tree DP
二叉苹果树
题目
有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点)
这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1。
我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有4个树枝的树
2 5
/ /
3 4
/ /
1
现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。
给定需要保留的树枝数量,求出最多能留住多少苹果。
输入格式
第1行2个数,N和Q(1<=Q<= N,1<N<=100)。
N表示树的结点数,Q表示要保留的树枝数量。接下来N-1行描述树枝的信息。
每行3个整数,前两个是它连接的结点的编号。第3个数是这根树枝上苹果的数量。
每根树枝上的苹果不超过30000个。
输出格式
一个数,最多能留住的苹果的数量。
样例输入
5 2
1 3 1
1 4 10
2 3 20
3 5 20
样例输出
21
------------------------------
分析:因为树是二叉的,所以状态转移方程很容易写出,
f[i][m]表示第i个节点下,共保留m个树枝的最大苹果数目。
ch[i,L]表示i树左边的枝条集合, ch[i,R]表示i树右边的枝条集合
f[ch[i,L],n]表示在i树左边的枝条集合中选取n个枝条的最大苹果数目
f[ch[i,R],n]表示在i树右边的枝条集合中选取n个枝条的最大苹果数目
方程:f[i][m]=max{
f[ch[i,L],n]+f[ch[i,R],m-n]]} (0<=n<=m) 其中L,R为i的左右子树
公式太抽象,举个例子
对于如下苹果树

有7个节点a,b,c,d,e,f,g; 有6条边,边的权重分别为5,24,20,30,21,27
求f[a][4],即只保留4个枝条,最多留下多少苹果?
根据公式,f[a][4] = max
{
f[ch[a,L],3]+f[ch[a,R],1],
f[ch[a,L],2]+f[ch[a,R],2],
f[ch[a,L],1]+f[ch[a,R],3]
}
其中f[ch[a,L],3]=f[b,2]
+ 5 (枝条ab的权重);
所以
f[a][4] = max
{
5+f[b][2]+24,
5+f[b][1]+24+f[c][1],
5+24+f[c][2]
}
f[b][2]=50,f[b][1]=30,f[c][1]=27,f[c][2]=48
f[a][4] =f[ch[a,L],2]
+ f[ch[a,R],2]=
5+f[b][1]+24+f[c][1]=86;
题目2:看守道路
一个城堡的所有的道路形成一个n个节点的树,如果在一个节点上放上一个士兵,那么和这个节点相连的边就会被看守住,问把所有边看守住最少需要放多少士兵?
这个题目,是典型的树形动态规划
求解:
dproot[i]表示以i为根的子树,在i上放置一个士兵,看守住整个子树需要多少士兵。
all[i]表示看守住整个以i为根的子树需要多少士兵。(不一定要在i上,放置士兵)
状态转移方程:
叶子节点:dproot[k]=1; all[k]=0;
all[k]=0表示要看守住含有叶子节点道路,一定可以不用在叶子节点放置守卫
非叶子节点:
dproot[i]=1+∑all[j](j是i的儿子);
all[i]=min(dproot[i],∑dproot[j](j是i的儿子));
这个题目还是比较简单的,如果把题目中树改为看守一个n个节点的图呢?
DP Intro - Tree DP的更多相关文章
- DP Intro - Tree DP Examples
因为上次比赛sb地把一道树形dp当费用流做了,受了点刺激,用一天时间稍微搞一下树形DP,今后再好好搞一下) 基于背包原理的树形DP poj 1947 Rebuilding Roads 题意:给你一棵树 ...
- DP Intro - Tree POJ2342 Anniversary party
POJ 2342 Anniversary party (树形dp 入门题) Anniversary party Time Limit: 1000MS Memory Limit: 65536K To ...
- HDU5293(SummerTrainingDay13-B Tree DP + 树状数组 + dfs序)
Tree chain problem Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- HDU3534(SummerTrainingDay13-C tree dp)
Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Partial Tree(DP)
Partial Tree http://acm.hdu.edu.cn/showproblem.php?pid=5534 Time Limit: / MS (Java/Others) Memory Li ...
- 96. Unique Binary Search Trees (Tree; DP)
Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...
- DP Intro - poj 1947 Rebuilding Roads(树形DP)
版权声明:本文为博主原创文章,未经博主允许不得转载. Rebuilding Roads Time Limit: 1000MS Memory Limit: 30000K Total Submissi ...
- HDU 4359——Easy Tree DP?——————【dp+组合计数】
Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- TYOI Day1 travel:Tree dp【处理重复走边】
题意: 给你一棵树,n个节点,每条边有长度. 然后有q组询问(u,k),每次问你:从节点u出发,走到某个节点的距离mod k的最大值. 题解: 对于无根树上的dp,一般都是先转成以1为根的有根树,然后 ...
随机推荐
- psimpl_v7_win32_demo
psimpl - generic n-dimensional polyline simplification 通用N维折线简化程序 Author - Elmar de Koning 作者 - Elma ...
- 编写高质量代码改善C#程序的157个建议——建议18:foreach不能代替for
建议18:foreach不能代替for 上一个建议中提到了foreach的两个优点:语法更简单,默认调用Dispose方法,所有我们强烈建议在实际的代码编写中更多的使用foreach.但是,该建议也有 ...
- 牌型总数——第六届蓝桥杯C语言B组(省赛)第七题
原创 牌型种数 小明被劫持到X赌城,被迫与其他3人玩牌.一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张.这时,小明脑子里突然冒出一个问题:如果不考虑花色,只考虑点数,也不考虑自己得 ...
- duilib入门简明教程 -- 自绘标题栏(5)
如果大家有做过标题栏的自绘,肯定会感慨各种不容易,并且现有的一些资料虽然完美的实现了功能,但是代码比较乱,需要自行整理.如果用duilib,就是小case啦. duilib其实并没有区分 ...
- [转] SAAS, PAAS, IAAS
SaaS:软件即服务.如CRM.HRM.SCM等等,是可以直接使用的,所以是和多数用户接触最多的一个层面,典型的比如CRM类软件SalesForce. PaaS:平台即服务.如数据挖掘.系统管理.编程 ...
- TSQL--SET ANSI_NULLS OFF
当ANSI_NULLS 为ON时,遵循SQL92的标准,只能使用IS NULL 来判断值是否为NULL, 而不能使用=或<>来与NULL做比较,任何值包括NULL值与NULL值做=或< ...
- 手机打车APP的机遇与挑战
所谓打车APP,就是个能安装在手机上的打车软件.原理是通过GPS进行定位,能够搜索附近的空车信息然后反馈给用户.同样的,空车信息也会反馈给用户.一般这种啊APP都是跟地图类软件一起的.比如百度地图,谷 ...
- c#后台弹出框
ClientScript.RegisterStartupScript(this.GetType(), "message", "<script>alert('提 ...
- Android学习笔记 Toast屏幕提示组件的使用方法
activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...
- SpringMVC+Hibernate 项目开发之二 (STS整合Maven)
为什么用STS不用Eclipse,主要是Eclipse集成Maven把我整疯了,最后估计原因除在网速上了. 其实用了STS以后发现还真比Eclipse好用点. STS本身集成有Maven的,但是默认的 ...