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

思路:首先既然是给定一颗树,先要选择合适的数据结构,来保存这颗树。由于这颗树只关心根节点在哪里,所以只需要用一个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. poj 2342 Anniversary party 简单树形dp

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

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

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

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

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

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

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

  6. HDU 3899 简单树形DP

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

  7. hdu1520 Anniversary party 简单树形DP

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

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

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

  9. HDU 4705 Y (2013多校10,1010题,简单树形DP)

    Y Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submiss ...

随机推荐

  1. SharePoint 2013 工作流设计之Designer 使用“可视化视图”

    SharePoint 2013增强了工作流功能,而Designer里面也添加了可视化设计视图,也就是类似Visio的设计视图(需要Visio 2013支持),下面我们简单介绍下,在可视化视图下,使用工 ...

  2. ubuntu安装VNC、Xfce桌面

    1.首先安装xfce桌面环境 sudo apt-get -y install xfce4 2.安装vncserver sudo apt-get -y install vnc4server 3.设置访问 ...

  3. join和setdaemon()初探

    join()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行,那么在调用这个线程时可以使用被调用线程 ...

  4. java Graphics2D 画图

    在Java中,当需要画一些特殊的形状时,比如说椭圆.矩形等,可以使用 Graphics2D 来绘图. 一些API: g.drawLine(3,3,50,50);//画一条线段 g.drawRect(8 ...

  5. Solr自动生成ID

    在Solr中,每一个索引,都要有一个唯一的ID,类似于关系型数据库表中的主键.为了方便创建索引,需要配置自动生成的ID,即UUID. 一.配置schema.xml文件 添加uuid字段类型,修改字段i ...

  6. perl 异步请求和JS对比

    perl 异步和js对比: /js************** $(function(){ function isPhone(str){ var regex = /[0-9]{11,11}/; ret ...

  7. 记一次JavaWeb网站技术架构总结

    题记 工作也有几多年了,无论是身边遇到的还是耳间闻到的,多多少少也积攒了自己的一些经验和思考,当然,博主并没有太多接触高大上的分布式架构实践,相对比较零碎,随时补充. 俗话说的好,冰冻三尺非一日之寒, ...

  8. SQL Server分页存储过程通用存储过程

    CREATE proc [dbo].[p_paging]@tableName varchar(8000),          --表名.视图名@indexCol varchar(50) = 'id', ...

  9. 微服务(Microservices )简介

    概念 微服务架构风格是一种将单个应用程序作为一套小型服务开发的方法,每种应用程序都在自己的进程中运行, 并与轻量级机制(通常是HTTP资源API)进行通信. 这些服务是围绕业务功能构建的,可以通过全自 ...

  10. ArrayBlcokingQueue,LinkedBlockingQueue与Disruptor三种队列对比与分析

    一.基本介绍 ArrayBlcokingQueue,LinkedBlockingQueue是jdk中内置的阻塞队列,网上对它们的分析已经很多,主要有以下几点: 1.底层实现机制不同,ArrayBlco ...