首页 > TAG信息列表 > P3174
P3174 [HAOI2009] 毛毛虫
非常好的一道树形dp 我开始一直陷入了思维误区 认为最优解可能不但是从子树转移过来还可能是从父亲转移过来的 这就非常头疼了 转移方程不好写啊 但实际上直接从下向上转移就好 为什么 因为最优解 保证一定存在一个节点 最优解为该节点最大子树和次大子树之和 最为极端的情况就是P3174 [HAOI2009]毛毛虫
Jisoo \(dp_i\)表示节点i为头的最长毛毛虫 (我这里i的父节点呗算作腿的一条) 然后就可以不用特判地进行转移 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define int long long using namespace std; int n,m; struct ed{ int to; int ne; }ed[6P3174 [HAOI2009]毛毛虫 题解
CSDN同步 原题链接 简要题意: 给定一棵树,求最长的 “挂链” 长度。 挂链定义为:一条链上所有节点与其相连的节点构成的生成树。(非严谨定义)(原题中是 “毛毛虫”,本人以为挂链更形象) 这题有多种做法,这里给出思路,以及其中一种做法的代码。 算法一 注意到,其实我们只需要选出 “最长链”,然P3174 [HAOI2009]毛毛虫
P3174 [HAOI2009]毛毛虫 好题 先放一个恶俗的东西: 《The Very Hungry Caterpillar》 (有人知道吗?童年回忆啊!) 分析: 设每一个点的入度是a[i],主干路径点数为len 毛毛虫点数=∑a[i]-len+2 (i均是主干路径上的点) 考虑原因:主干路径两端端点不需要管,中间点都被多算了一次 化简洛谷P3174 [HAOI2009]毛毛虫
树形DP,注意答案是节点数,我一直以为是边数懵逼了半个小时 #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #define maxn 300010 using namespace std; struct node { int ed,len,nxt; }; node edge[maxn<<1]; int n,m,first[maxn]