题意:给定一棵树,从中选出一些节点,使得不成父子关系的节点对数最多。问这个最大值是多少。

思路:首先既然是给定一颗树,先要选择合适的数据结构,来保存这颗树。由于这颗树只关心根节点在哪里,所以只需要用一个fa数组来保存每个点的根节点,此外设初始化为0,所以根节点的fa[root]为0,所以从任意一个结点的父节点往上遍历,直到遍历到某某个结点的父节点为0,则这个结点就是父节点

这道题个人感觉关键是从根节点开始往下dp,所以根节点要确定..

这道题的状态转移方程为,dp[i][1],选用第i个节点时,所能得到的最大对数,dp[i][0]不选用第i个节点时所能得到的最大对数,dp[i][0]=求和max(dp[j][0],dp[j][1]);dp[i][1]=求和dp[j][0].所以每一个父节点都依赖于它的子节点。所以递归求每一个子节点的dp[j]的值,最后在累加到dp[i]上,而边界条件是,递归到叶子节点时,dp[i][0]=0,dp[i][1]=1;加上代码

int n;  // 结点个数
int dp[maxn][]; // dp[i][0] 表示不选择结点 i,dp[i][1] 表示选择结点 i
int father[maxn]; // father 记录了结点的父结点编号 void tree_dp(int node) {
dp[node][] = ;
dp[node][] = ;
for(int i = ; i <= n; i++) {
if(father[i] == node) { // i 为 node 的子结点
tree_dp(i); // 递归计算子结点
// 关键
dp[node][] += dp[i][]; // 选择父结点,则必须不选择子结点
dp[node][] += max(dp[i][], dp[i][]); // 不选择父结点,则可以选择或不选择子结点
}
}
} int main() {
int f, c, root;
scanf("%d", &n);
memset(father, , sizeof(father));
memset(visited, , sizeof(visited));
root = ; // 记录树的根结点
while (scanf("%d %d", &c, &f), c || f) { // 读入父子关系,前一个结点是后一个结点的孩子
father[c] = f;
root = f;
}
while(father[root]) { // 查找根结点
root = father[root];
}
tree_dp(root); // 从根结点出发进行动态规划
printf("%d\n", max(dp[root][], dp[root][])); // 求出最终答案,根可以选或不选
return ;
}

一道简单树形dp的更多相关文章

  1. [10.27_P2] 统计损失 (简单树形DP)

    树形DP 简单题 Description 给定一棵树,每个节点有一个值.对于一条路径,它的值为路径上所有点的值的乘积.求出树上所有路径的值的和. 注意:单个点也算一条路径. Input 第 1 行一个 ...

  2. [Luogu P1122]最大子树和 (简单树形DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P1122 Solution 这是一道简单的树形DP题. 首先,我们可以转换一下题面,可以发现,题目要求我们求 ...

  3. poj 2342 Anniversary party 简单树形dp

    Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3862   Accepted: 2171 ...

  4. hdu4705 Y 简单树形DP 2013多校训练第十场 J题

    题意:求一棵树中不在一条链中的三个点的对数. 转化一下,用总对数减去在一条链上的三点对数即可. 考虑经过根节点,然后可能是不同的子树中各选一个:或者是子树中选一个,然后当前节点为根的子树以外的节点选一 ...

  5. hdu 1054 Strategic Game (简单树形DP)

    Strategic Game Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  6. hdu 1520Anniversary party(简单树形dp)

    Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  7. HDU 3899 简单树形DP

    题意:一棵树,给出每个点的权值和每条边的长度, 点j到点i的代价为点j的权值乘以连接i和j的边的长度.求点x使得所有点到点x的代价最小,输出 虽然还是不太懂树形DP是什么意思,先把代码贴出来把. 这道 ...

  8. hdu1520 Anniversary party 简单树形DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 思路:树形DP的入门题 定义dp[root][1]表示以root为根节点的子树,且root本身参 ...

  9. Nowcoder contest 370F Rinne Loves Edges (简单树形DP) || 【最大流】(模板)

    <题目链接> 题目大意: 一个 $n$ 个节点 $m$ 条边的无向连通图,每条边有一个边权 $w_i$.现在她想玩一个游戏:选取一个 “重要点” S,然后选择性删除一些边,使得原图中所有除 ...

随机推荐

  1. sendmail邮件自动发送

    配置邮件自动发送: 1.安装软件 yum -y install sendmail mailx 2.发送邮件的邮箱授权 eg:y******@126.com 网页网易云邮箱登陆 --> 设置 -- ...

  2. js中的值类型和引用类型的区别

    1.JavaScript中的变量类型有哪些? (1)值类型(基本类型):字符串(String).数值(Number).布尔值(Boolean).Undefined.Null  (这5种基本数据类型是按 ...

  3. php三级联动(html,php两个页面)

    <!doctype html><html><head><meta charset="utf-8"><title>无标题文 ...

  4. HTTP协议实际使用笔记

    mozilla的帮助文档: https://developer.mozilla.org/zh-CN/docs/Web/HTTP HTTP协议详解(转) php http头设置相关信息 这个2篇最好先看 ...

  5. virtualenv与virtualenvwrapper虚拟环境

    python开发之virtualenv与virtualenvwrapper讲解 在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题: 亦或者是在开发过程中不想让物 ...

  6. 将lits集合转化为树状结构

    一,bean的类型: public class DeptListRES { /** * 子节点 */ private List<DeptListRES> children; private ...

  7. [Day7]循环、数组方法、排序查找

    1. ASCII(American Standard Code for Information Interchange) (1)数字0-9对应ASCII编码十进制为48-57, 字母a-z对应ASCI ...

  8. bugfree3.0.1-修改“优先级”为中文引起的PHP Error

    博主在搭建好bugfree后,修改了系统中“优先级”字段,将原先系统定义的优先级“1.2.3.4”修改为符合博主自己项目要求的优先级“高.中.低”.修改成功后,系统确实将原先提交的BUG优先级从“1. ...

  9. ORACLE——count() 统计函数的使用

    SQL中用于统计的函数时:COUNT(). 针对count函数的使用做一个记录,很简单. 首先我数据库中建个表TEST,数据如下: 表中ID和NAME都是不重复的数据,HOME.TEL.PATH中存在 ...

  10. C# Tuple<T1,T2....T>元组的使用

    1) 先说组元:一个数据结构,由通过逗号分割的,用于传递给一个程序或者操作系统的一系列值的组合. NET Framework 直接支持一至七元素的元组 Tuple<T1> Tuple< ...