题目链接

树形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)的更多相关文章

  1. poj 2486 Apple Tree(树形DP 状态方程有点难想)

    Apple Tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9808   Accepted: 3260 Descri ...

  2. POJ 2486 Apple Tree (树形dp 经典题)

    #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const ...

  3. 【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 ...

  4. POJ 2486 Apple Tree (树形DP,树形背包)

    题意:给定一棵树图,一个人从点s出发,只能走K步,每个点都有一定数量的苹果,要求收集尽量多的苹果,输出最多苹果数. 思路: 既然是树,而且有限制k步,那么树形DP正好. 考虑1个点的情况:(1)可能在 ...

  5. POJ 2486 Apple Tree

    好抽象的树形DP......... Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6411 Accepte ...

  6. URAL_1018 Binary Apple Tree 树形DP+背包

    这个题目给定一棵树,以及树的每个树枝的苹果数量,要求在保留K个树枝的情况下最多能保留多少个苹果 一看就觉得是个树形DP,然后想出 dp[i][j]来表示第i个节点保留j个树枝的最大苹果数,但是在树形过 ...

  7. POJ 2486 Apple Tree(树形dp)

    http://poj.org/problem?id=2486 题意: 有n个点,每个点有一个权值,从1出发,走k步,最多能获得多少权值.(每个点只能获得一次) 思路: 从1点开始,往下dfs,对于每个 ...

  8. poj 2486 Apple Tree (树形背包dp)

    本文出自   http://blog.csdn.net/shuangde800 题目链接: poj-2486 题意 给一个n个节点的树,节点编号为1~n, 根节点为1, 每个节点有一个权值.    从 ...

  9. POJ 2486 Apple Tree ( 树型DP )

    #include <iostream> #include <cstring> #include <deque> using namespace std; #defi ...

随机推荐

  1. asp.net日志跟踪方法

    1. 页面级的配置 要在页面级启用跟踪功能,就要在@Page指令中设置Trace属性.如下所示: *************************************************** ...

  2. 【云计算】Kubernetes、Marathon等框架需要解决什么样的问题?

    闲谈Kubernetes 的主要特性和经验分享       Capitalonline全球云主机.全球私有网络,免费试用进行时 »   主要介绍 Kubernetes 的主要特性和一些经验.先从整体上 ...

  3. 【架构】docker环境搭建mysql主从

    序 本文主要研究怎么在docker上搭建mysql的主从.因为在单机搭建mysql多实例然后再配主从,感觉太痛苦了,环境各有不同,配置各不大相 同,从网上找搭建方法,试了半天也没成功,最后也没耐心调试 ...

  4. org.apache.catalina.session.StandardManager doLoad

    转载自:http://www.cnblogs.com/java727/p/3300613.html SEVERE: IOException while loading persisted sessio ...

  5. Lubuntu下配置Python开发环境

    安装完系统必须要做的几件事: 一.更新软件    (如果是通过最新版镜像安装,可无视此步骤)    1.选择速度比较快的源,默认的源速度不一定快.二.配置终端    1.设置终端背景,前景色,透明度  ...

  6. Secure Socket Tunneling Protocol Service服务无法启动(win7)

    第一种方法: 1.确认一下服务都开启: Base Filtering Engine IKE and Authip IPsec Keying Module Ipsec Policy Agent Wind ...

  7. C语言,输入一个正整数,按由大到小的顺序输出它的所有质数的因子(如180=5*3*3*2*2)

    #include <iostream> using namespace std; int main() { long num; while(cin >> num){ ){ co ...

  8. Material Design入门

    本文主要包括以下内容 ToolBar的使用 RecyclerView的定义与使用 ToolBar 风格 (style) 界面 (layout) 程序 (java) 首先自定义一个theme,并将App ...

  9. mysql 指定端口

    mysql -P3307 -uemove -h180. -p #-P是指定端口

  10. Android中几种定位 方式

    介绍的几种定位方式 http://www.cnblogs.com/cuihongyu3503319/p/3863867.html 百度地图api: http://lbsyun.baidu.com/in ...