从每个节点u出发后有两种情况:回到u和不回到u。

dp数组设为三维,第一维是节点编号,第二维是从该节点开始走的步数,第三维1/0 表示是否回到该节点。

可以回到时:dp[u][j][1]=max(dp[u][j][1],dp[u][j-t][1]+dp[v][t-2][1]);

不能回到时,分为两种情况:1.最终停在v子树上 2.最终停在其他子树上。

1.dp[u][j][0]=max(dp[u][j][0],dp[u][j-t][1]+dp[v][t-1][0]);

2.dp[u][j][0]=max(dp[u][j][0],dp[u][j-t][0]+dp[v][t-2][1]);

我们要枚举j和t,j代表的意义上文提到了,t则表示在从u到v这棵子树上走的步数,那么j-t就是在其他子树上走的步数,每棵子树v都要被枚举,由此分析可以得到上面的三种情况。

之所以叫树形背包是因为枚举j和t的部分类似于背包问题,其中j是要倒推的,因为每个节点的苹果树只能摘一次,摘完就没有了。(参考01背包的倒推思想)

 1 #include<cstdio>
2 #include<cstring>
3 #include<algorithm>
4 using namespace std;
5 const int M=210;
6 int n,k,cnt;
7 //dp[u][j][0]表示以u为根的树经过j步没有回到点u得到的最值
8 //dp[u][j][1]表示以u为根的树经过j步回到点u得到的最值
9 int dp[M][M][2],val[M],head[M];
10
11 struct edge{
12 int v,next;
13 }e[M<<1];
14
15 void init(){
16 memset(head,0,sizeof(head));
17 memset(dp,0,sizeof(dp));
18 cnt=0;
19 }
20
21 void add(int u,int v){
22 e[++cnt].next=head[u];
23 head[u]=cnt;
24 e[cnt].v=v;
25 }
26
27 void dfs(int u,int fa){
28 for(int i=0;i<=k;i++)
29 dp[u][i][0]=dp[u][i][1]=val[u];
30 for(int i=head[u];i;i=e[i].next){
31 int v=e[i].v;
32 if(v==fa) continue;
33 dfs(v,u);
34 for(int j=k;j>=1;j--)//树形背包
35 for(int t=1;t<=j;t++){
36 dp[u][j][0]=max(dp[u][j][0],dp[u][j-t][1]+dp[v][t-1][0]);
37 if(t>=2) dp[u][j][1]=max(dp[u][j][1],dp[u][j-t][1]+dp[v][t-2][1]);
38 if(t>=2) dp[u][j][0]=max(dp[u][j][0],dp[u][j-t][0]+dp[v][t-2][1]);
39 }
40 }
41 }
42
43 int main(){
44 int u,v;
45 while(~scanf("%d%d",&n,&k)){
46 init();
47 for(int i=1;i<=n;i++) scanf("%d",&val[i]);
48 for(int i=1;i<n;i++){
49 scanf("%d%d",&u,&v);
50 add(u,v);add(v,u);
51 }
52 dfs(1,-1);
53 printf("%d\n",max(dp[1][k][0],dp[1][k][1]));
54 }
55 return 0;
56 }

做这道题就是要从一个节点u分析,考虑他的情况(如本题回到与不回到),从而进一步分析每种可能的情况,得到方程。

POJ2486 Apple Tree(树形背包)的更多相关文章

  1. POJ2486 - Apple Tree(树形DP)

    题目大意 给定一棵n个结点的树,每个结点上有一定数量的苹果,你可以从结点1开始走k步(从某个结点走到相邻的结点算一步),经过的结点上的苹果都可以吃掉,问你最多能够吃到多少苹果? 题解 蛋疼的问题就是可 ...

  2. poj2486Apple Tree[树形背包!!!]

    Apple Tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9989   Accepted: 3324 Descri ...

  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 状态方程有点难想)

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

  5. Kattis - redblacktree Red Black Tree (树形背包)

    问题:有一课含有n(n<=2e5)个结点的数,有m(m<=1000)个结点是红色的,其余的结点是黑色的.现从树中选若干数量的结点,其中红色的恰有k个,并且每个结点都不是其他任何另一个结点的 ...

  6. 【bzoj4987】Tree 树形背包dp

    题目描述 从前有棵树. 找出K个点A1,A2,…,Ak. 使得∑dis(AiAi+1),(1<=i<=K-1)最小. 输入 第一行两个正整数n,k,表示数的顶点数和需要选出的点个数. 接下 ...

  7. POJ2486 Apple Tree

    Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %lld & %llu Description Wshxzt is ...

  8. poj2486 Apple Tree (树形dp+分组背包)

    题目链接:https://vjudge.net/problem/POJ-2486 题意:一棵点权树,起点在1,求最多经过m条边的最大点权和. 思路: 树形dp经典题.用3维状态,dp[u][j][0/ ...

  9. POJ2486 Apple Tree(树形DP)

    题目大概是一棵树,每个结点都有若干个苹果,求从结点1出发最多走k步最多能得到多少个苹果. 考虑到结点可以重复走,容易想到这么个状态: dp[u][k][0]表示在以结点u为根的子树中走k步且必须返回u ...

随机推荐

  1. 方法引用_通过this引用本类的成员方法和方法引用_类的构造器(构造方法)引用和数组的构造器引用

    package com.yang.Test.ThisMethodReference; /** * 通过this引用本类的成员方法 */ public class Husband { //定义一个买房子 ...

  2. 使用github action发布hexo博客到云服务器

    目录 搭建Hexo博客 安装主题hexo-theme-bamboo 修改博客名称等信息 添加github action发布 1. 在github中创建自己的博客仓库 2. 设置Secrets 3. 在 ...

  3. SkiaSharp 之 WPF 自绘 弹动小球(案例版)

    没想到粉丝对界面效果这么喜欢,接下来就尽量多来点特效,当然,特效也算是动画的一部分了.WPF里面已经包含了很多动画特效的功能支持了,但是,还是得自己实现,我这边就来个自绘实现的. 弹动小球 弹动小球是 ...

  4. 整除分块套杜教筛为什么是 O(n^2/3) 的

    假设我们要筛一个东西叫做 \(f\) . 记 \[D(n)=\left\{n,\left\lfloor\dfrac n2\right\rfloor,\left\lfloor\dfrac n3\righ ...

  5. 在Centos下对高并发web框架Tornado的性能进行测试

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_89 在之前的一篇文章中,我们在1g1核的惨淡硬件环境下,对 uwsgi + django 和 gunicorn+ django 的 ...

  6. Odoo 如何下载指定版本源码 && .cfg配置参数

    # 我们使用应用市场上的模块的时候,经常会碰到模块只兼容特定版本,要将模块兼容到自己版本来的时候,就需要下载它原兼容odoo的版本运行. # 这里的-b后面加的11.0就是它的版本.在git中也就是分 ...

  7. SpringBoot定时任务 - 经典定时任务设计:时间轮(Timing Wheel)案例和原理

    Timer和ScheduledExecutorService是JDK内置的定时任务方案,而业内还有一个经典的定时任务的设计叫时间轮(Timing Wheel), Netty内部基于时间轮实现了一个Ha ...

  8. 分布式链路追踪Jaeger + 微服务Pig在Rainbond上的实践分享

    随着微服务架构的流行,客户端发起的一次请求可能需要涉及到多个或 N 个服务,致使我们对服务之间的监控和排查变得更加复杂. 举个例子: 某条业务线的某个接口调用服务端时快时慢,这时就需要排查各个服务的日 ...

  9. [51nod 1822]序列求和

    \(k\leq 200000\) 考虑转化成枚举 \(k\) 的形式 我们错位相减! \[A_k=\sum_{i=1}^N i^K\times R^i \\ RA_k=\sum_{i=2}^{N+1} ...

  10. mybatis 02: 添加并简单使用mybatis

    三层架构 项目开发时,遵循的一种设计模式,分为三层 界面层:用来接收客户端输入的数据,调用业务逻辑层进行功能处理,返回结果给客户端 过去的servlet就完成了界面层的功能(但是他做的更多) 业务逻辑 ...