树形DP
文章平均质量分 77
double1994
这个作者很懒,什么都没留下…
展开
-
HDOJ 2196 Computer
树形DP。求最长单链。用一种把自己也绕糊涂的方式做出来了- -!首先以第一台电脑为根节点,记录每个节点到每个子节点所属子孙节点中最长的距离。再求出除自己及自己子孙节点外到自己最长的距离。最后输出到自己子孙节点与到其他节点中最长的即可。 在求每个节点子节点最大值时,也要求出次大值,并记录最大值的下标,在求与其他节点最长距离时要用。 PS:在更新到子孙节点最大距离时,记得更新次大值。一开始在这里错原创 2013-09-19 19:43:17 · 622 阅读 · 0 评论 -
HDU 1561 The more, The Better
树形dp。卡了下。一开始是在一条链上做dp,当1为根节点,2,3都是其子节点时,我的做法无法同时选1,2,3。dp第一位代表节点,第二维代表用掉数目,由下一层节点递归上来。ps:改掉了波神吐槽的指针。。。 #include #include #include #include #include #include using namespace std; typedef long lo原创 2014-03-13 21:46:02 · 437 阅读 · 0 评论 -
POJ 3140 Contestants Division
树形dp,水。 求将一棵节点有权值的树分成两块,两块总权值差最小值。 ps:注意本题要用longlong,第一次应该wa在这里,然后换了种写法,导致tot和mv未初始化,再wa一发。这类题目初始化问题需要格外注意。 #include #include #include #include #include #include using namespace std; typedef l原创 2014-03-12 16:22:35 · 507 阅读 · 0 评论 -
HDOJ 1520 Anniversary party
树状DP入门。每组数据只有一颗树。一开始当二叉做,错了- -!一开始子节点开了1005,后来又试了105,都可以。 #include #include #include #include using namespace std; int n; struct Node { int par; int v; int son[105];//HDOJ数据中子节点105即可原创 2013-09-18 19:54:09 · 556 阅读 · 0 评论 -
HDU 2196 Computer【new】
树形dp, 重写一遍。还是wa了几发。有以下几个注意的点:1.没初始化;2.一开始有些错误导致超时,然后用vis数组记录了下访问,变成了wa,其实没必要,我的写法只是遍历一遍树。3.两台电脑之间的距离不是1,虽然样例给的是。。。fdp返回值应该是mv[x] + v[x],v[x]为当前节点与父亲节点的距离;4.1节点的fv不能更新,因为其父节点为自身,按fdp中更新后会另mvp[x]节点下的父节点原创 2014-03-11 22:06:58 · 404 阅读 · 0 评论 -
POJ 3107 Godfather
给一棵树,去掉一个节点后,剩下块中最大值最小时,此节点为要找的节点。思路很简单,深搜一遍就可以了。关键是存储,要用邻接表。表示之前完全不知道又邻接表这回事。。。图论一点没看- -!憋了N天(N>10)。。。 #include #include #include #include using namespace std; struct Node { int v; Node *n原创 2013-10-11 09:50:53 · 589 阅读 · 0 评论 -
POJ 1655 Balancing Act
树形dp,水。 平衡值是去掉当前节点后剩下的树中节点数最大的树的节点数,求最小平衡值。多个答案任意输出一组。把2378的代码稍微改改就行了。。。 ps:双向存边时,边数应至少为节点的两倍,否则会RE. #include #include #include #include #include #include using namespace std; typedef long lon原创 2014-03-12 15:28:39 · 439 阅读 · 0 评论 -
POJ 2378 Tree Cutting
树形dp,水。不存在找不到答案的情况。当1.子节点中节点数最大的与2.所有节点减去当前节点加所有子节点和的数目都小于等于n/2时满足条件。 ps:邻接表双向存边,访问注意不能回头访问父节点。 #include #include #include #include #include #include using namespace std; typedef long long LL;原创 2014-03-12 15:16:44 · 539 阅读 · 0 评论 -
HDOJ 3586 Information Disturbing
给一颗树,1为根节点,要切断1与所有叶子的联系,每条边有权值,给定权值总和上限,求在给定总和上限内切断单条边权值中最大值的最小值。 二分上限即可。 #include #include #include #include using namespace std; int n,m,idx; int sum[1005],mx[1005],c[1005][1005]; struct Node {原创 2013-10-13 20:14:52 · 490 阅读 · 0 评论 -
POJ 1947 Rebuilding Roads
树形dp。dp[i][j],表示以第i个节点为根节点,形成含有j个节点的子树最少去掉的边。最后计算答案时除根节点外,其余节点的答案都要+1,因为与父节点有条边。状态由下一层转移过来时dp[i][j] = min(dp[i][j], dp[tmp][x] + dp[i][j - x] - 1);减1是减掉下层与当前节点连接的边。 ps:因为必然有答案,所以转移状态时不需要特判。必须从sum[rt]原创 2014-03-15 10:47:20 · 506 阅读 · 0 评论