题目大意:给定一棵 N 个节点的有根树,点有点权,边权均为1。现允许从根节点出发走 K 步,求可以经过的点权之和最大是多少。

题解:可以将点权看作是价值,将可以走的步数看作是重量,则转化成了一个树上背包问题。

显然状态中的两个维度应该有以 i 为根和走的步数,但是发现若从当前节点走到了其中一个子节点的子树中,若还想走当前节点的其他子节点,则必须先回到当前节点。因此,还需记录一个状态,表示从当前节点出发,是否最后回到了当前节点。

代码如下

#include <bits/stdc++.h>
#define pb push_back
using namespace std;
const int maxn=110; vector<int> G[maxn];
int n,m,a[maxn],dp[110][210][2]; void dfs(int u,int fa){
for(auto v:G[u]){
if(v==fa)continue;
dfs(v,u);
for(int j=m;j>=1;j--)
for(int k=0;k<j;k++){
if(j-k-2>=0){
dp[u][j][1]=max(dp[u][j][1],dp[u][j-2-k][1]+dp[v][k][1]);
dp[u][j][0]=max(dp[u][j][0],dp[u][j-k-2][0]+dp[v][k][1]);
}
dp[u][j][0]=max(dp[u][j][0],dp[u][j-1-k][1]+max(dp[v][k][0],dp[v][k][1]));
}
}
for(int i=0;i<=m;i++){
dp[u][i][0]+=a[u],dp[u][i][1]+=a[u];
}
}
void read_and_parse(){
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
G[x].pb(y),G[y].pb(x);
}
}
void solve(){
dfs(1,0);
printf("%d\n",max(dp[1][m][0],dp[1][m][1]));
}
void init(){
for(int i=1;i<=n;i++)G[i].clear();
memset(dp,0,sizeof(dp));
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
init();
read_and_parse();
solve();
}
return 0;
}

【POJ2486】Apple Tree的更多相关文章

  1. 【POJ3321】Apple Tree(DFS序,树状数组)

    题意:给一棵n个节点的树,每个节点开始有一个苹果,m次操作 1.将某个结点的苹果数异或 1 2.查询一棵子树内的苹果数 n,m<=100000   思路:最近一段时间在思考树上统计问题的算法 发 ...

  2. 【POJ 2486】 Apple Tree(树型dp)

    [POJ 2486] Apple Tree(树型dp) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8981   Acce ...

  3. 【BZOJ】2631: tree LCT

    [题意]给定n个点的树,每个点初始权值为1,m次操作:1.x到y的点加值,2.断一条边并连一条边,保证仍是树,3.x到y的点乘值,4.x到y的点权值和取模.n,m<=10^5. [算法]Link ...

  4. 【BZOJ2212】[Poi2011]Tree Rotations 线段树合并

    [BZOJ2212][Poi2011]Tree Rotations Description Byteasar the gardener is growing a rare tree called Ro ...

  5. 【题解】Digit Tree

    [题解]Digit Tree CodeForces - 716E 呵呵以为是数据结构题然后是淀粉质还行... 题目就是给你一颗有边权的树,问你有多少路径,把路径上的数字顺次写出来,是\(m\)的倍数. ...

  6. 【题解】[P4178 Tree]

    [题解]P4178 Tree 一道点分治模板好题 不知道是不是我见到的题目太少了,为什么这种题目都是暴力开值域的桶QAQ?? 问点对,考虑点分治吧.直接用值域树状数组开下来,统计的时候直接往树状数组里 ...

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

  8. 【树形dp】Apple Tree

    [poj2486]Apple Tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10800   Accepted: 3 ...

  9. 【codeforces 348B】Apple Tree

    [题目链接]:http://codeforces.com/problemset/problem/348/B [题意] 给你一棵树; 叶子节点有权值; 对于非叶子节点: 它的权值是以这个节点为根的子树上 ...

随机推荐

  1. Kettle使用教程之数据同步

    数据模型原型如下: 1.表输入,针对最新的数据输入的表 2.目标表,需要更新的表 3.两个表都需要进行排序操作 4.合并,根据id进行合并 5.数据同步(包括更新.插入.删除) 6.点击运行,就可以实 ...

  2. Jmeter(七)参数化

    初识Jmeter的时候, 除了感觉安装和配置都很轻量以外, 还有一个最大的感触就是, 翻译真硬啊, 真的够够的! 和他磨合了挺长一段时间之后, 终于开悟了, 这些硬硬的翻译, 其实还是基本靠谱的, 看 ...

  3. 使用jedis执行lua脚本

    转: redis学习(十五) 使用jedis执行lua脚本(实现一个对IP的限流) 2018年09月15日 20:07:26 码农-文若书生 阅读数:1609   使用jedis执行lua脚本(实现一 ...

  4. STM32 PWM注意事项

    频率: f = 时钟周期 / Prescaler / Period: 占空比 = ( Pulse / Period )* 100 %: 需要注意的是,Pulse 不能大于 Period 

  5. 网易云课堂_C++程序设计入门(下)_第10单元:月映千江未减明 – 模板_第10单元 - 单元作业:OJ编程 - 创建数组类模板

    第10单元 - 单元作业:OJ编程 - 创建数组类模板 查看帮助 返回   温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提 ...

  6. 关于struts2防止表单重复提交

    struts2防表单重复提交有两种方式. 其一是action的重定向,跳转时设置type为从一个action跳转到另一个action或者另一个页面, 使用户提交后,所停留的位置,不是当前处理数据的Ac ...

  7. this引用逸出

    1.定义 public class UnsafeClass { public UnsafeClass(Button button) { button.addActionListener(new Act ...

  8. Elasticsearch-安装、日志解读

    ES-安装.日志解读 1. 准备tar包 https://www.elastic.co/cn/products/elasticsearch2. 解压 tar -zxvf elasticsearch-. ...

  9. 使用二阶微分锐化图像(拉普拉斯算子)基本原理及Python实现

    1. 拉普拉斯算子 1.1 简介 一种典型的各向同性的微分算子,可用于检测图像中灰度图片的区域 $$ \nabla^{2} f=\frac{\partial^{2} f}{\partial x^{2} ...

  10. 严重报错: Error configuring application listener of class org.springframework.web.context.ContextLoaderLis

    其实可能是你的jar文件没有同步发布到自己项目的lib目录中(如果你是用Maven进行构建的话) 可以试试 下面的办法 项目点击右键 点击 Properties 选择Deployment Assemb ...