题目大意:一棵点带权有根树,根节点为1。从根节点出发,走k步,求能收集的最大权值和。

题目分析:从一个点向其某棵子树出发有三种可能的情况:

1、停留在那棵子树上;

2、再回到这个点;

3、经过这个点走向了其他分支;

定义状态dp(u,k,0/1)表示在u节点为根的子树上走k步并且不回/回到u的最大权值和。则状态转移方程为:

dp(u,k,0)=max(dp(son,j-2,1)+dp(u,k-j,0),dp(u,k-j,1)+dp(son,j-1,0))

dp(u,k,1)=max(dp(son,j-2,1)+dp(u,j-k,1))

代码如下:

# include<iostream>
# include<cstdio>
# include<vector>
# include<cstring>
# include<algorithm>
using namespace std; const int N=105; int n,m;
int w[N];
int dp[N][N<<1][2];
vector<int>e[N]; void init()
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;++i){
e[i].clear();
scanf("%d",w+i);
for(int j=0;j<=m;++j)
dp[i][j][0]=dp[i][j][1]=w[i];
}
int a,b;
for(int i=1;i<n;++i){
scanf("%d%d",&a,&b);
e[a].push_back(b);
e[b].push_back(a);
}
} void dfs(int u,int fa)
{
for(int i=0;i<e[u].size();++i){
int v=e[u][i];
if(v==fa) continue;
dfs(v,u);
for(int j=m;j>=1;--j){
for(int k=1;k<=j;++k){
dp[u][j][0]=max(dp[u][j][0],dp[v][k-1][0]+dp[u][j-k][1]);
if(k>=2){
dp[u][j][0]=max(dp[u][j][0],dp[v][k-2][1]+dp[u][j-k][0]);
dp[u][j][1]=max(dp[u][j][1],dp[v][k-2][1]+dp[u][j-k][1]);
}
}
}
}
} void solve()
{
dfs(1,-1);
printf("%d\n",max(dp[1][m][0],dp[1][m][1]));
} int main()
{
while(~scanf("%d%d",&n,&m))
{
init();
solve();
}
return 0;
}

  

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)

    题目链接 树形DP很弱啊,开始看题,觉得貌似挺简单的,然后发现貌似还可以往回走...然后就不知道怎么做了... 看看了题解http://www.cnblogs.com/wuyiqi/archive/2 ...

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

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

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

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

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

  6. POJ 2486 Apple Tree

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

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

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

  8. POJ 2486 Apple Tree(树形dp)

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

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

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

  10. POJ 2486 Apple Tree ( 树型DP )

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

随机推荐

  1. tornado介绍

    一.定义 tornado是一个异步非阻塞模型的服务器(tcp/http).web框架. 二.特性 1.高并发 原因:其一,网络事件循环部分根据操作系统选择最高效的,如Linux会是epoll: 其二, ...

  2. DataNode,NameNode,JobTracker,TaskTracker用jps查看无法启动解决办法

    查看tasktracker的50060的地址无法正常查看,主要有两个原因,一个是在/tmp目录下有以前使用2.02版本留下的文件没有删除,二个是因为端口被占用了 解决方法: 一.删除/tmp目录下所有 ...

  3. UIScrollerView常见属性

    CGSize contentSize :设置UIScrollView的滚动范围 CGPoint contentOffset :UIScrollView当前滚动的位置 UIEdgeInsets cont ...

  4. litepal的jar包

    转自http://blog.csdn.net/luohai859/article/details/39292607 LitePal是一款开源的Android数据库框架,它采用了对象关系映射(ORM)的 ...

  5. Js判断键盘按键

    该文转自: namehwh 网址:http://www.cnblogs.com/hanwenhua/articles/3365154.html window.document.onkeydown = ...

  6. 重拾java系列一java基础(2)

    1.分支流程控制 if(布尔表达式/分支条件){  //语句块} if(布尔表达式/分支条件){  //语句块1}else{  //语句块2} if(条件1){  //语句块1}else if(条件2 ...

  7. 让NSURLConnection在子线程中运行

    可以有两个办法让NSURLConnection在子线程中运行,即将NSURLConnection加入到run loop或者NSOperationQueue中去运行. 前面提到可以将NSTimer手动加 ...

  8. Investment_完全背包

    Description John never knew he had a grand-uncle, until he received the notary's letter. He learned ...

  9. Android Priority Job Queue (Job Manager)(一)

     Android Priority Job Queue (Job Manager)(一) 一.为什么要引入Android Priority Job Queue (Job Manager)?如今的A ...

  10. Unity3D ShaderLab 模拟精灵动画

    Unity3D ShaderLab 模拟精灵动画 在上一篇,介绍了通过Shader 模拟纹理运动,那么更深一步讲,我们也可以把帧动画的精灵纹理运动通过shader实现. 虽然大家都是在游戏脚本中做更高 ...