树形dp
as604412059
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
树形DPhdu1502
题目描述:每个节点有权值,不能同时选择相邻的两个节点,问最后选的最大价值。 贪心的想法是要不选子节点,要不选父亲节点,可是有可能最优的是两个节点都不选。 那么就是类似01背包选择路线,来个dp[i][2],0表示不选,1表示选,那么从叶子节点往根节点不断更新就好了,状态转移方程 dp[i][1]=sum(dp[j][0]) dp[i][0]=sum(max(dp[j][1].dp[j][0]原创 2016-08-04 15:50:47 · 305 阅读 · 0 评论 -
树形DPhdu2196
给你n个电脑,每两台电脑之间有权值,给出n-1条边,问每台电脑距离其它电脑最远的距离。 这道题最开始我是先随便选个点跑dfs,得到当前节点距离最远距离的点j,然后从j开始跑更新子节点从父亲节点来的最大值,然后再得到当前节点距离最远的点k,然后从k再开始跑更新子节点从父亲节点来的最大值。最后输出即可,可总感觉会有bug但太弱菜无法证明。之后发现菊苣们都是对当前节点考虑,只需要更新从子节点来的最大距离原创 2016-08-04 16:03:09 · 276 阅读 · 0 评论 -
树形DP poj1741
题目描述:有n个点和n-1条边,dist(u,v)为u和v之间的最小距离,问两个点之间的dist(u,v)<=k的uv对数。 做法:假如枚举每一个点暴力跑肯定是超时的,那么这道题就需要lgn的级数来做,看了大牛们的做法是树上分治。大体思想为每回求出当前的树重心,以重心为根得到重心到子结点<=k的距离,大于k就没必要要了。对得到距离进行排序,然后可以两边从中间跑,当dis(l)+dis(r)<=k时原创 2016-08-07 15:52:00 · 401 阅读 · 0 评论 -
树形DPpoj3162
题意给出n-1条边,每个点有一个最远距离,为最长的一段区间,这个区间内的最远距离最大值和最小值的差不超过m。 这道题我最先跑最远距离用的是取子结点和父亲节点过来的最大值的方法,但是一直超时,我想应该是用的vector存边导致的吧(方便坑人。。)后来用另外一种方法求。求出最远距离后就是两个指针一起跑,然后要得到这两个指针区间的最大值和最小值,可以用线段树也可以用单调队列,我用的单调队列,代码如下#i原创 2016-08-08 15:29:42 · 639 阅读 · 0 评论 -
树形DPpoj2152
题目描述:有n个城镇, 每个城镇在D(i)距离内需要至少有一个消防站,在每个城镇修建一个消防站需花费W(i),给出n个城市之间的网络图,问修建费用最少。主要还是看了陈启峰大牛的论文才能弄懂。 做法:设dp(i)(j)为 ①在以为根的子树里修建一些消防站; ②在结点必须修建一个消防站; ③以为根的子树内的每个结点在不超过距离的前提下,选择一个在子树内或结点上的消防站作为负责站; ④结点必须选原创 2016-08-08 17:40:15 · 466 阅读 · 0 评论 -
cf 218D
给出n-1条边,dp[i]为i为根需改变的边数使得i能到达任意一个点。 升序输出最小的dp(i)的下标。#include<stdio.h>#include<string.h>#include<iostream>#include<vector>#include<algorithm>using namespace std;const int maxn=2*100000+10,inf=1e9原创 2016-08-11 14:36:01 · 431 阅读 · 0 评论
分享