二叉苹果树

题目 
有一棵苹果树,如果树枝有分叉,一定是分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的更多相关文章

  1. DP Intro - Tree DP Examples

    因为上次比赛sb地把一道树形dp当费用流做了,受了点刺激,用一天时间稍微搞一下树形DP,今后再好好搞一下) 基于背包原理的树形DP poj 1947 Rebuilding Roads 题意:给你一棵树 ...

  2. DP Intro - Tree POJ2342 Anniversary party

    POJ 2342 Anniversary party (树形dp 入门题) Anniversary party Time Limit: 1000MS   Memory Limit: 65536K To ...

  3. HDU5293(SummerTrainingDay13-B Tree DP + 树状数组 + dfs序)

    Tree chain problem Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  4. HDU3534(SummerTrainingDay13-C tree dp)

    Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. Partial Tree(DP)

    Partial Tree http://acm.hdu.edu.cn/showproblem.php?pid=5534 Time Limit: / MS (Java/Others) Memory Li ...

  6. 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 ...

  7. DP Intro - poj 1947 Rebuilding Roads(树形DP)

    版权声明:本文为博主原创文章,未经博主允许不得转载. Rebuilding Roads Time Limit: 1000MS   Memory Limit: 30000K Total Submissi ...

  8. HDU 4359——Easy Tree DP?——————【dp+组合计数】

    Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  9. TYOI Day1 travel:Tree dp【处理重复走边】

    题意: 给你一棵树,n个节点,每条边有长度. 然后有q组询问(u,k),每次问你:从节点u出发,走到某个节点的距离mod k的最大值. 题解: 对于无根树上的dp,一般都是先转成以1为根的有根树,然后 ...

随机推荐

  1. android library使用方法

    一.Android library使用情景 通用模块的重复使用,项目做多了,其实都是差不多,核心模块基本无需大的改动,需要改的只是核心模块上的业务功能而已. Java中可以打包成库,或者说,单纯的ja ...

  2. WebApi与MVC Route 问题整理

    1. 为WebAPI添加 Area后,完成了CustomControllerSelector的制定. 跟踪WebAPI底层,整理WebAPI源码后发现几个问题: 1. 使用Area的controlle ...

  3. 图像读取Exif小知识,图像扶正,还原拍摄时的角度

    在做人脸识别的时候发现很多手机拍摄的图像在C#读取之后方向出现了错误,Bitmap中的宽度和实际的windows的文件属性内的参数相反,引起一阵测试和思考,后来百度出来可以用Exif来解决 githu ...

  4. 关于C#中Timer定时器的重入问题解决方法(也适用于多线程)

    项目中用到了定时器随着服务启动作定时任务,按指定的准点时间定时执行相关操作,但是在指定准点时间内我只想让它执行一次,要避免重入问题的发生. 首先简单介绍一下timer,这里所说的timer是指的Sys ...

  5. MongoDB插入时间不正确的问题

    关于mongodb插入时间不正确的问题 今天在给mongodb插入日期格式的数据时发现,日期时间相差8个小时,原来存储在mongodb中的时间是标准时间UTC +0:00,而中国的时区是+8.00 . ...

  6. 《C#多线程编程实战》2.10 SpinWait

    emmm 这个SpinWait 中文是自旋等待的意思. 所谓自旋,就是自己追自己影子,周伯通的左右手互博,不好听就是放屁自己追着玩,小狗转圈咬自己的尾巴 SpinWait是一个结构体,并不是一个类. ...

  7. dubbo服务治理中间件,zookeeper注册中心 安装配置

    对传统项目架构进行拆分: 集群概念: 面向服务分布式架构: 服务层提供被注册的对象需要实现序列化接口Serializable: 配置表现层和服务层: 依赖包: 服务层: <!-- 定义dubbo ...

  8. 【bzoj2437】[Noi2011]兔兔与蛋蛋 二分图最大匹配+博弈论

    Description Input 输入的第一行包含两个正整数 n.m. 接下来 n行描述初始棋盘.其中第i 行包含 m个字符,每个字符都是大写英文字母"X".大写英文字母&quo ...

  9. LongAdder源码学习

    原文链接:https://blog.csdn.net/u011392897/article/details/60480108 LongAdder是jdk8新增的用于并发环境的计数器,目的是为了在高并发 ...

  10. SQL Server 数据类型与.Net Framework平台映射

    SQL Server 和 .NET Framework 基于不同的类型系统.  例如,.NET Framework Decimal 结构的最大小数位数为 28,而 SQL Server 的 decim ...