树形DP codevs 1814 最长链

codevs 1814 最长链

时间限制: 1 s

空间限制: 256000 KB

题目等级 : 钻石 Diamond

题目描述 Description

现给出一棵N个结点二叉树,问这棵二叉树中最长链的长度为多少,保证了1号结点为二叉树的根。

输入描述 Input Description

输入的第1行为包含了一个正整数N,为这棵二叉树的结点数,结点标号由1至N。

接下来N行,这N行中的第i行包含两个正整数l[i], r[i],表示了结点i的左儿子与右儿子编号。如果l[i]为0,表示结点i没有左儿子,同样地,如果r[i]为0则表示没有右儿子。

输出描述 Output Description

输出包括1个正整数,为这棵二叉树的最长链长度。

样例输入 Sample Input

5

2 3

4 5

0 6

0 0

0 0

样例输出 Sample Output

4

数据范围及提示 Data Size & Hint

【样例说明】

  4-2-1-3-6为这棵二叉树中的一条最长链。

【数据规模】

对于10%的数据,有N≤10;

对于40%的数据,有N≤100;

对于50%的数据,有N≤1000;

对于60%的数据,有N≤10000;

对于100%的数据,有N≤100000,且保证了树的深度不超过32768。

【提示】

关于二叉树:

二叉树的递归定义:二叉树要么为空,要么由根结点,左子树,右子树组成。左子树和右子树分别是一棵二叉树。

请注意,有根树和二叉树的三个主要差别:

1. 树的结点个数至少为1,而二叉树的结点个数可以为0;

2. 树中结点的最大度数没有限制,而二叉树结点的最大度数为2;

3. 树的结点无左、右之分,而二叉树的结点有左、右之分。

关于最长链:

最长链为这棵二叉树中一条最长的简单路径,即不经过重复结点的一条路径。可以容易证明,二叉树中最长链的起始、结束结点均为叶子结点。

 1 /*典型的·树形DP:最长链=max(所有左孩子单链最长+右孩子单链最长),当前节点的单链最长是递推出来的,当前节点的单链最长=max(左右孩子单链最长)+1;*/
 2 #define N 100010
 3 #include<iostream>
 4 using namespace std;
 5 #include<cstdio>
 6 int lian[N],ans=0;
 7 int l[N],r[N],n,c[N];
 8 void input()
 9 {
10     scanf("%d",&n);
11     for(int i=1;i<=n;++i)
12     {
13         scanf("%d%d",&l[i],&r[i]);
14     }
15 }
16 int dfs(int k)
17 {
18     if(k==0) return 0;
19     c[l[k]]=dfs(l[k]);
20     c[r[k]]=dfs(r[k]);
21     ans=max(ans,c[l[k]]+c[r[k]]+1);
22     return c[k]=max(c[l[k]],c[r[k]])+1;
23 }
24 int main()
25 {
26     input();
27     ans=max(dfs(1),ans);
28     printf("%d\n",ans-1);
29     return 0;
30 }
时间: 2024-11-18 23:45:57

树形DP codevs 1814 最长链的相关文章

codevs 1814 最长链

二次联通门 : codevs 1814 最长链 /* codevs 1814 最长链 树形DP 当前点(LQZ)的最大价值由他的 左儿子(HKD) 和 右儿子(SYL)的最大价值转移而来 其余细节乱搞一下就可 我还是水的很开心啦.. */ #include <cstdio> #define Max 100080 inline int max (int a, int b) { return a > b ? a : b; } void read (int &now) { now =

codevs——1814 最长链

1814 最长链 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 现给出一棵N个结点二叉树,问这棵二叉树中最长链的长度为多少,保证了1号结点为二叉树的根. 输入描述 Input Description 输入的第1行为包含了一个正整数N,为这棵二叉树的结点数,结点标号由1至N. 接下来N行,这N行中的第i行包含两个正整数l[i], r[i],表示了结点i的左儿子与右儿子编号.如果l[i]为0,表示结点i没有左儿子,同样

HDU5886 Tower Defence 【两遍树形dp】【最长链预处理】

题意:N个点的一棵带权树.切掉某条边的价值为切后两树直径中的最大值.求各个边切掉后的价值和(共N-1项). 解法一: 强行两遍dp,思路繁琐,维护东西较多: dis表示以i为根的子树的直径,dis2表示切掉以i为根的子树后的直径. 第一遍dp,记录 down[][0]:从i结点向下的最大距离  down[][1]:与down[][0]无交集的向下次大距离  dis:以i为根的子树的直径 第二遍dp,记录 up:从i结点向上的最远距离, 可以是w+父节点的up,也可以是w+父节点的down(判断一

1814 最长链

1814 最长链 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 现给出一棵N个结点二叉树,问这棵二叉树中最长链的长度为多少,保证了1号结点为二叉树的根. 输入描述 Input Description 输入的第1行为包含了一个正整数N,为这棵二叉树的结点数,结点标号由1至N. 接下来N行,这N行中的第i行包含两个正整数l[i], r[i],表示了结点i的左儿子与右儿子编号.如果l[i]为0,表示结点i没有左儿子,同样

codevs——T1814 最长链

http://codevs.cn/problem/1814/ 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 现给出一棵N个结点二叉树,问这棵二叉树中最长链的长度为多少,保证了1号结点为二叉树的根. 输入描述 Input Description 输入的第1行为包含了一个正整数N,为这棵二叉树的结点数,结点标号由1至N. 接下来N行,这N行中的第i行包含两个正整数l[i], r[i],表示了结点i的左儿子

HDU 6201 2017沈阳网络赛 树形DP或者SPFA最长路

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6201 题意:给出一棵树,每个点有一个权值,代表商品的售价,树上每一条边上也有一个权值,代表从这条边经过所需要的花费.现在需要你在树上选择两个点,一个作为买入商品的点,一个作为卖出商品的点,当然需要考虑从买入点到卖出点经过边的花费.使得收益最大.允许买入点和卖出点重合,即收益最小值为0. 解法:我们设1为根节点,假设一开始一个人身上的钱为0.我们设dp[i][0]表示从根节点走到i及其子树并中任一点买

HDU 4616 Game(经典树形dp+最大权值和链)

http://acm.hdu.edu.cn/showproblem.php?pid=4616 题意:给出一棵树,每个顶点有权值,还有存在陷阱,现在从任意一个顶点出发,并且每个顶点只能经过一次,如果经过了c个陷阱就不能再走了,计算最大能获得的权值和. 思路:有点像树链剖分,对于一个以u为根的子树,因为每个顶点只能经过一次,那我们只能选择它的一个子树往下走.就像是把这棵树分成许多链,最后再连接起来. 这道题目麻烦的地方是陷阱的处理,用d[u][j][0/1]表示以u为根的某一子节点经过j个陷阱后到达

(并查集+树形DP) hdu 4514

湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 3269    Accepted Submission(s): 587 Problem Description 随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,

HDU 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形dp, 对于每条链u,v,w,我们只在lca(u,v)的顶点上处理它 让dp[i]表示以i为根的指数的最大值,sum[i]表示dp[vi]的和(vi为i的儿子们) 则i点有两种决策,一种是不选以i为lca的链,则dp[i]=sum[i]. 另一种是选一条以i为lca的链,那么有转移方程:dp[i]=