题目大意:一棵点带权有根树,根节点为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. android 禁止viewPager 滑动

    public class ContainerViewPager extends MyViewPager { public ContainerViewPager(Context context, Att ...

  2. hadoop创建两大错误:Bad connection to FS. command aborted. exception和Shutting down NameNod...

    我的hadoop启动后,各个节点都正常,但是无法查看hdfs目录,错误提示 Bad connection to FS. command aborted.  查了下网上的解决办法,主要是删除tmp下的所 ...

  3. SharePoint 2013 Nintex Workflow 工作流帮助(七)

    博客地址 http://blog.csdn.net/foxdave 工作流动作 11. Check out item(Libraries and lists分组) 与上一个对应,用于签出条目.如果一个 ...

  4. iOS APP提交上架最新流程

          时隔1年又让我鼓捣iOS,刚接手就是上架,经验值为0的我,虽然内心是拒绝的,但还是要接受这项任务滴!也就是在被拒后重新审核,再改在提交...这样反复的过程中也对上架流程熟悉了好多,写篇帖子 ...

  5. EditTest输入类型设置

    1,当输入为文字性密码时,输入前有提示效果,输入后有遮蔽效果 android:hint="@string/hint_etPassword" android:inputType=&q ...

  6. <em>标签

    <em> 标签告诉浏览器把其中的文本表示为强调的内容.对于所有浏览器来说,这意味着要把这段文字用斜体来显示.

  7. SVG 2D入门7 - 重用与引用

    前面介绍了很多的图形元素,如果很多图形本身是一样的,需要每次都去定义一个新的么?我们能否共用一些图形呢?这是这节的重点 - SVG元素的重用. 组合 - g元素      g元素是一种容器,它组合一组 ...

  8. Python中的闭包

    简单的闭包的栗子: def counter(statr_at = 0): count = 1 def incr(): nonlocal count #注意由于count类型为immutable,所以需 ...

  9. (spring-第15回【IoC基础篇】)容器事件

    五个人在报社订阅了报纸.报社一旦有了新报纸,就派员工分别送到这五个人手里.在这个例子中,“报纸”就是事件,“报社”就是广播器,五个订阅者就是监听器.广播器收到事件,把事件传给监听器,监听器对事件做一些 ...

  10. iOS:死锁

    死锁:指多个进程因竞争共享资源而造成的一种僵局,若无外力作用,这些进程都将永远不能再向前推进. 安全状态与不安全状态:安全状态指系统能按某个进程顺序来为每个进程分配其所需资源,直至最大需求,使每个进程 ...