POJ 2486 Apple Tree(树形DP)
树形DP很弱啊,开始看题,觉得貌似挺简单的,然后发现貌似还可以往回走...然后就不知道怎么做了...
看看了题解http://www.cnblogs.com/wuyiqi/archive/2012/01/09/2316758.html画画题解中的三种情况,还是可以理解的。
设dp[0][s][j]表示从s(当前根节点)出发,走 j 步,回到s所能获得的最大权值
dp[1][s][j]表示从s(当前根节点)出发,走j步,不回到s所能获得的最大权值
现在我们就可以分配背包容量了:父节点与子节点分配背包容量,从而设计出状态转移方程
主要思想:
s返回,t返回
s不返回,t返回(走向t子树,t子树返回之后走向s的其他子树,然后不回到s)
s返回,t不返回(遍历s的其他子树后返回s,返回之后走向t子树,然后不回到t)
没有都不返回,肯定有一方有一个返回的过程,再去另一边的子树的
总结起来一句话,要么去s的其他子树呆着,要么去t子树呆着,要么回到s点
1、在t子树返回,其他子树也返回,即回到当前根节点s
2,、不返回根节点,但在t子树返回,即相当于从t出发走k步返回t的最优值 加上 从s出发走j-k步到其他子树不返回的最优值,中间有s与t连接起来,其实就等于从s出发遍历t子树后(dp[0][t][k])又回到s(这一步多了中间的来回两步),再走出去(其他子树)【dp[1][s][j-k]】,不回来
3、不返回根节点,在t子树也不返回,等价于从s出发遍历其他子树,回到s(dp[0][s][j-k]),再走向t子树,不回到t(dp[1][t][k]),这个过程s-t只走了一步
dp[0][s][j+2]=Max(dp[0][s][j+2],dp[0][t][k]+dp[0][s][j-k]);//从s出发,要回到s,需要多走两步s-t,t-s,分配给t子树k步,其他子树j-k步,都返回
dp[1][s][j+2]=Max(dp[1][s][j+2],dp[0][t][k]+dp[1][s][j-k]);//不回到s(去s的其他子树),在t子树返回,同样有多出两步
dp[1][s][j+1]=Max(dp[1][s][j+1],dp[1][t][k]+dp[0][s][j-k]);//先遍历s的其他子树,回到s,遍历t子树,在当前子树t不返回,多走一步
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <cmath>
- #include <algorithm>
- using namespace std;
- #define N 200100
- #define LL __int64
- #define lson l,m,rt<<1
- #define rson m+1,r,rt<<1|1
- struct node
- {
- int u,v,next;
- }edge[];
- int dp[][][];
- int first[];
- int p[];
- int t,n,k;
- void CL()
- {
- t = ;
- memset(first,-,sizeof(first));
- memset(dp,,sizeof(dp));
- }
- void add(int u,int v)
- {
- edge[t].u = u;
- edge[t].v = v;
- edge[t].next = first[u];
- first[u] = t ++;
- }
- void dfs(int rt)
- {
- int i,j,son,v;
- for(i = ;i <= k;i ++)
- dp[rt][i][] = dp[rt][i][] = p[rt];
- for(i = first[rt];i != -;i = edge[i].next)
- {
- son = edge[i].v;
- dfs(son);
- for(j = k;j >= ;j --)
- {
- for(v = ;v <= j;v ++)
- {
- dp[rt][j+][] = max(dp[rt][j+][],dp[rt][v][]+dp[son][j-v][]);
- dp[rt][j+][] = max(dp[rt][j+][],dp[rt][v][]+dp[son][j-v][]);
- dp[rt][j+][] = max(dp[rt][j+][],dp[rt][v][]+dp[son][j-v][]);
- }
- }
- }
- }
- int main()
- {
- int i,u,v;
- while(scanf("%d%d",&n,&k)!=EOF)
- {
- CL();
- for(i = ;i <= n;i ++)
- scanf("%d",&p[i]);
- for(i = ;i < n;i ++)
- {
- scanf("%d%d",&u,&v);
- add(u,v);
- }
- dfs();
- printf("%d\n",dp[][k][]);
- }
- return ;
- }
POJ 2486 Apple Tree(树形DP)的更多相关文章
- poj 2486 Apple Tree(树形DP 状态方程有点难想)
Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9808 Accepted: 3260 Descri ...
- POJ 2486 Apple Tree (树形dp 经典题)
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const ...
- 【POJ 2486】 Apple Tree (树形DP)
Apple Tree Description Wshxzt is a lovely girl. She likes apple very much. One day HX takes her to a ...
- POJ 2486 Apple Tree (树形DP,树形背包)
题意:给定一棵树图,一个人从点s出发,只能走K步,每个点都有一定数量的苹果,要求收集尽量多的苹果,输出最多苹果数. 思路: 既然是树,而且有限制k步,那么树形DP正好. 考虑1个点的情况:(1)可能在 ...
- POJ 2486 Apple Tree
好抽象的树形DP......... Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6411 Accepte ...
- URAL_1018 Binary Apple Tree 树形DP+背包
这个题目给定一棵树,以及树的每个树枝的苹果数量,要求在保留K个树枝的情况下最多能保留多少个苹果 一看就觉得是个树形DP,然后想出 dp[i][j]来表示第i个节点保留j个树枝的最大苹果数,但是在树形过 ...
- POJ 2486 Apple Tree(树形dp)
http://poj.org/problem?id=2486 题意: 有n个点,每个点有一个权值,从1出发,走k步,最多能获得多少权值.(每个点只能获得一次) 思路: 从1点开始,往下dfs,对于每个 ...
- poj 2486 Apple Tree (树形背包dp)
本文出自 http://blog.csdn.net/shuangde800 题目链接: poj-2486 题意 给一个n个节点的树,节点编号为1~n, 根节点为1, 每个节点有一个权值. 从 ...
- POJ 2486 Apple Tree ( 树型DP )
#include <iostream> #include <cstring> #include <deque> using namespace std; #defi ...
随机推荐
- Linux CPU负载
昨天查看Nagios警报信息,发现其中一台服务器CPU负载过重,机器为CentOS系统.信息如下: 2011-2-15 (星期二) 17:50 WARNING - load average: 9.73 ...
- SSDB 数据库如何换用 rocksdb 引擎?
牧童遥指杏花村,一枝红杏出墙来… SSDB 数据库如何换用 rocksdb 引擎? idea's blog 2014-04-12 71 阅读 rocksdb NoSQL SSDB 数据库使用的是 G ...
- 8个开发必备的PHP功能
做过PHP开发的程序员应该清楚,PHP中有很多内置的功能,掌握了它们,可以帮助你在做PHP开发时更加得心应手,本文将分享8个开发必备的PHP功能,个个都非常实用,希望各位PHP开发者能够掌握. 1.传 ...
- VMware Snapshot 工作原理
VMware中的快照是对VMDK在某个时间点的“拷贝”,这个“拷贝”并不是对VMDK文件的复制,而是保持磁盘文件和系统内存在该时间点的状态,以便在出现故障后虚拟机能够恢复到该时间点.如果对某个虚拟机创 ...
- Group Shifted Strings
Given a string, we can "shift" each of its letter to its successive letter, for example: & ...
- Merge Two Sorted Arrays
Merge two given sorted integer array A and B into a new sorted integer array. Example A=[1,2,3,4] B= ...
- iOS 转载一篇日期处理文章
感谢原作者的辛勤付出,由于时间太久,记不住原来的地址了,如果你是原作者,请联系我,我会添加原文连接,谢谢! iOS处理时间的类主要包括NSDate,NSDateFormatter, NSDateCom ...
- UVA 11827 Maximum GCD (输入流)
题目:传送门 题意:求n个数的最大公约数,暴力不会超时,难点在没有个数控制的输入. 题解:用特殊方法输入. #include <iostream> #include <cmath&g ...
- Find them, Catch them(poj 1703)
题目大意: 在这个城市里有两个黑帮团伙,现在给出N个人,问任意两个人他们是否在同一个团伙输入D x y代表x于y不在一个团伙里输入A x y要输出x与y是否在同一团伙或者不确定他们在同一个团伙里 思路 ...
- JQuery的AJAX封装加例子
将json字符串转换为javascript对象有两种方法:var strs = eval("(" + data + ")");var strs = $.pars ...