POJ2486 Apple Tree(树形背包)
从每个节点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(树形背包)的更多相关文章
- POJ2486 - Apple Tree(树形DP)
题目大意 给定一棵n个结点的树,每个结点上有一定数量的苹果,你可以从结点1开始走k步(从某个结点走到相邻的结点算一步),经过的结点上的苹果都可以吃掉,问你最多能够吃到多少苹果? 题解 蛋疼的问题就是可 ...
- poj2486Apple Tree[树形背包!!!]
Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9989 Accepted: 3324 Descri ...
- 【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 状态方程有点难想)
Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9808 Accepted: 3260 Descri ...
- Kattis - redblacktree Red Black Tree (树形背包)
问题:有一课含有n(n<=2e5)个结点的数,有m(m<=1000)个结点是红色的,其余的结点是黑色的.现从树中选若干数量的结点,其中红色的恰有k个,并且每个结点都不是其他任何另一个结点的 ...
- 【bzoj4987】Tree 树形背包dp
题目描述 从前有棵树. 找出K个点A1,A2,…,Ak. 使得∑dis(AiAi+1),(1<=i<=K-1)最小. 输入 第一行两个正整数n,k,表示数的顶点数和需要选出的点个数. 接下 ...
- POJ2486 Apple Tree
Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %lld & %llu Description Wshxzt is ...
- poj2486 Apple Tree (树形dp+分组背包)
题目链接:https://vjudge.net/problem/POJ-2486 题意:一棵点权树,起点在1,求最多经过m条边的最大点权和. 思路: 树形dp经典题.用3维状态,dp[u][j][0/ ...
- POJ2486 Apple Tree(树形DP)
题目大概是一棵树,每个结点都有若干个苹果,求从结点1出发最多走k步最多能得到多少个苹果. 考虑到结点可以重复走,容易想到这么个状态: dp[u][k][0]表示在以结点u为根的子树中走k步且必须返回u ...
随机推荐
- USB转串口参数配置功能
当使用USB转串口芯片时,在部分场合下需要修改芯片内部的USB参数以满足其应用需要.常见如: 系统下使用多个USB转串口芯片,区分使用各芯片. 修改厂商ID.产品ID.厂商字符串,使用客户自有ID和信 ...
- windows下memcache安装
Windows下的Memcache安装:1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:memcached2. 在终端(也即cmd命令界面)下输入 'c:memcache ...
- vue中vuex实现持久化的几种方法
前提:大家都知道vuex真的数据共享是不持久的,例如登录后一刷新,state中存的token就会消失,导致你需要再次进行登录操作 在这给大家列出几种解决方案: 第一种(也是一些项目中常使用的):使用缓 ...
- Java学习--基础
java学习 基础 Java三大版本 javase 标准版 占领桌面端(基础) javame 移动版 嵌入式开发.占领手机端 javaee 企业版 占领服务器端 Java的特性和优势 跨平台.可移植性 ...
- Spring MVC组件之HandlerMapping
Spring MVC组件之HandlerMapping HandlerMapping概述 HandlerMapping组件的作用解析一个个Request请求,并找到相应处理这个Request的Hand ...
- spring boot 中英文官方文档
中文文档:http://oopsguy.com/documents/springboot-docs/1.5.4/index.html#boot-features 英文官方文档:https://docs ...
- Python自动化测试之文件操作
1.读.写.追加文件 读:打开文件 r 读写:r+ 写:w 可写不可读 清空原文件 写读:w+ 清空文件 追加:a+ 可以读写,文件不存在自动创建 练习读txt文件类容: #-*- c ...
- nginx的安装和配置
目录 目录 一.购买下载SSL证书 二.修改Nginx配置信息 三.重启Nginx 一.购买下载SSL证书 SSL证书阿里云做活动期间可以免费申请,购买SSL证书时选择单域名-DV SSL-免费版即可 ...
- clipboard实现文本复制的方法
1.下载地址: https://github.com/mo3408/clipboard 2.使用方法: 先引入js: <script src="dist/clipboard.min.j ...
- KingbaseES R6 集群手工配置VIP案例
经常有用户问,V8R6集群搭建时没有配置VIP,搭建完成后,如何添加VIP?以下向大家介绍下手动添加VIP 的过程. 一.操作系统环境 操作系统(UOS): root@uos01:~# cat /et ...