树形DP
big up
这个作者很懒,什么都没留下…
展开
-
uva10859
题目大意: 这题教会了我一个很有用的技巧:有两个所求的值要优化,比如让a尽量小,b也尽量小那么可以转化为让x = M*a+b尽量小,其中M应该是一个比“a的最大值和b的最小值之差”还要大的数最终的答案为a = ans/M, b = ans%M回到这题,要求放的灯总数最小,被两盏灯同时照亮的边数尽量大。因为每条边要么被一盏灯照亮,要么被两盏灯照亮,所以可以转换为:求:放的灯总数量最少,被一盏灯照亮的原创 2016-01-28 20:45:05 · 497 阅读 · 0 评论 -
uvalive4015
题目大意: 一棵n个节点的有根树,树的边有正整数权,表示两个节点之间的距离,你的任务是回答这样的询问,从根节点出发,走不超过x单位的距离,最多能走多少个节点,节点经过多次算一个,对于每次的询问输出:经过节点数最大的值思路: 树形DP。 树形DP一般都是用三维结构完成的。 dp[i][j][k]表示根节点为i经过了j个节点,类似于01背包,k== 0表示返回,k == 1表示不返回。 所以如原创 2016-04-26 11:38:51 · 312 阅读 · 0 评论 -
uvalive2038(树形DP基础题)
题目大意: 给定一棵树,要求选择尽量少的点,使得没有被选择的点都可以至少和一个已经选择的点相邻。思路: 树形DP。 类似于01背包问题。 树上的结点要么选要么不选。 dp[i][0]表示第i个结点不选 那么dp[i][0] += dp[j][1] 其中j是i的子树的根节点。 dp[i][1]表示第i个结点要选 那么dp[i][1] += min(dp[j][1],dp[j][0])发原创 2016-04-20 17:35:18 · 365 阅读 · 0 评论 -
uvalive4614 (这题不懂)
题意:给你一棵树,有一些点你需要去一定的次数,每去一次你都要回来,求最小的权值和参考的代码:#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define INF 1000000000000000LL using namespace std; const int MAX原创 2016-05-07 14:10:02 · 751 阅读 · 0 评论