POJ-2486 Apple Tree (树形DP)
题目大意:一棵点带权有根树,根节点为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)的更多相关文章
- poj 2486 Apple Tree(树形DP 状态方程有点难想)
Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9808 Accepted: 3260 Descri ...
- POJ 2486 Apple Tree(树形DP)
题目链接 树形DP很弱啊,开始看题,觉得貌似挺简单的,然后发现貌似还可以往回走...然后就不知道怎么做了... 看看了题解http://www.cnblogs.com/wuyiqi/archive/2 ...
- 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 ...
随机推荐
- pl/sql乱码
环境变量增加NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
- sql 之CONCAT用法
这是java交流群里一个网友面试的时候发过来的笔试题,我觉得题目的假定条件应该是某个字母对应的最小数字只有一个. 思路第一步是查出一个子表s1: select name,min(number) fro ...
- Actioncontext之类的map嵌套,取值
假设图中最顶端的map设为Actioncontext的map,这种情况,用<s:property value=""/>或者EL表达式取值,可以用#key1.key2.k ...
- 利用NTFS交换数据流隐藏文件
利用NTFS交换数据流隐藏文件 发表于 2012 年 12 月 15 日 由 晴刃 这篇文章介绍一下Windows的NTFS文件系统的ADS(alternate data streams,交换数据流) ...
- (转)iphone数据存储之-- Core Data的使用
原文:http://www.cnblogs.com/xiaodao/archive/2012/10/08/2715477.html iphone数据存储之-- Core Data的使用(一) 一. ...
- Http Framework
http request clientVolley https://android.googlesource.com/platform/frameworks/volley聚划算用的litehttp h ...
- GPRS Sniffing Tutorial
- Download sources into ~/gprs_sniffer git clone git://git.osmocom.org/osmocom-bb.git git clone git: ...
- PHP版本区别
- 【LEETCODE OJ】Reorder List
Problem link: http://oj.leetcode.com/problems/reorder-list/ I think this problem should be a difficu ...
- CRM客户关系管理系统 ——客户联系人添加(十五)
需求描述: 1.业务员自己可以查看属于自己的客户信息 2.客服部经理可以查看查看所有客户信息 3.其他人员不得查看客户信息 效果截图: