Apple Tree
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 7789   Accepted: 2606

Description

Wshxzt is a lovely girl. She likes apple very much. One day HX takes her to an apple tree. There are N nodes in the tree. Each node has an amount of apples. Wshxzt starts her happy trip at one node. She can eat up all
the apples in the nodes she reaches. HX is a kind guy. He knows that eating too many can make the lovely girl become fat. So he doesn’t allow Wshxzt to go more than K steps in the tree. It costs one step when she goes from one node to another adjacent node.
Wshxzt likes apple very much. So she wants to eat as many as she can. Can you tell how many apples she can eat in at most K steps.

Input

There are several test cases in the input 

Each test case contains three parts. 

The first part is two numbers N K, whose meanings we have talked about just now. We denote the nodes by 1 2 ... N. Since it is a tree, each node can reach any other in only one route. (1<=N<=100, 0<=K<=200) 

The second part contains N integers (All integers are nonnegative and not bigger than 1000). The ith number is the amount of apples in Node i. 

The third part contains N-1 line. There are two numbers A,B in each line, meaning that Node A and Node B are adjacent. 

Input will be ended by the end of file. 



Note: Wshxzt starts at Node 1.

Output

For each test case, output the maximal numbers of apples Wshxzt can eat at a line.

Sample Input

2 1
0 11
1 2
3 2
0 1 2
1 2
1 3

Sample Output

11
2

题目大意:给出一个n个节点的树,每一个节点上有个值,问不超过k步最高能够获得的值。i到j算一步,j到i也算一步

输入: 输入n和k。然后是n个节点的值,然后是n-1个i j代表了i和j节点相邻。

根是1.

非常easy看出来这是一个树状dp。dp[i][j]代表了以i节点为根。用j步能够得到的最大值,可是由于走到子树算是一步,走回到根也是一步,所以就要有两个dp关系,dp1[i][j]代表从i节点走j步又回到j节点的最大值,dp2[i][j]代表从i节点走j步不会到i节点的最大值。

那么状态转移方程为:当前节点为u。子树为v

回到i节点时:在节点u走j步,在子树v中走k步,从u到v和从v到u共走两步。那么在除v之外的其它子树走了j-k-2步。

dp1[u][j] = max(dp1[u][j],dp1[u][j-k-2]+dp1[v][k])

不回到i节点时:从节点u走j步

1.不在v子树中返回u,那么会在其它子树中返回u。在v中走k步。在u到v走一步,在除v外的子树走j-k-1步。

dp2[u][j] = max(dp2[u][j],dp1[u][j-k-1]+dp2[v][k])

2.在v子树中返回u,那么会在其它子树中存在不返回u的,在v中走k步。在u到v和v到u走两步。在除v之外的子树走j-k-2步。

dp2[u][j] = max(dp2[u][j],dp2[u][j-k-2]+dp1[v][k])

注意1:输入的节点i。j是相邻的关系。根是1。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std ;
struct tree{
int v , next ;
}edge[110];
int head[110] , cnt ;
int dp1[110][210] , dp2[110][210] ;//dp1返回。dp2不返回 dp[i][j]:从i节点出发使用j步能够得到的最大值
int c[110] , n , m ;
void add(int u,int v) {
edge[cnt].v = v ;
edge[cnt].next = head[u] ;
head[u] = cnt++ ;
return ;
}
void dfs(int u) {
int i , j , k , v ;
dp1[u][0] = dp2[u][0] = c[u] ;
if( head[u] == -1 )
return ;
for(i = head[u] ; i != -1 ; i = edge[i].next) {
v = edge[i].v ;
dfs(v) ;
}
for(i = head[u] ; i != -1 ; i = edge[i].next) {
v = edge[i].v ;
for(j = m ; j >= 0 ; j--) {
for(k = 0 ; k <= j ; k++) {
if( k+2 <= j ) {
dp1[u][j] = max(dp1[u][j],dp1[u][j-k-2]+dp1[v][k]) ;
dp2[u][j] = max(dp2[u][j],dp2[u][j-k-2]+dp1[v][k]) ;
}
if( k+1 <= j )
dp2[u][j] = max(dp2[u][j],dp1[u][j-k-1]+dp2[v][k]) ;
}
}
}
}
int Map[110][110] ;
queue <int> que ;
void bfs(int n) {
while( !que.empty() ) que.pop() ;
que.push(1) ;
int i , u , v ;
while( !que.empty() ) {
u = que.front() ;
que.pop() ;
for(i = 1 ; i <= n ; i++){
if( Map[u][i] == 1 ) {
Map[u][i] = Map[i][u] = 0 ;
add(u,i) ;
que.push(i) ;
}
}
}
}
int main() {
int i , j , u , v ;
while( scanf("%d %d", &n, &m) != EOF ) {
memset(head,-1,sizeof(head)) ;
memset(dp1,0,sizeof(dp1)) ;
memset(dp2,0,sizeof(dp2)) ;
memset(Map,0,sizeof(Map)) ;
cnt = 0 ;
for(i = 1 ; i <= n ; i++)
scanf("%d", &c[i]) ;
for(i = 1 ; i < n ; i++) {
scanf("%d %d", &u, &v) ;
Map[u][v] = Map[v][u] = 1 ;
}
bfs(n) ;
dfs(1) ;
int max1 = 0 ;
for(i = 0 ; i <= m ; i++) {
max1 = max(max1,dp2[1][i]) ;
}
printf("%d\n", max1) ;
}
return 0 ;
}

poj2486--Apple Tree(树状dp)的更多相关文章

  1. POJ 2486 Apple Tree [树状DP]

    题目:一棵树,每个结点上都有一些苹果,且相邻两个结点间的距离为1.一个人从根节点(编号为1)开始走,一共可以走k步,问最多可以吃多少苹果. 思路:这里给出数组的定义: dp[0][x][j] 为从结点 ...

  2. POJ 3321 Apple Tree(树状数组)

                                                              Apple Tree Time Limit: 2000MS   Memory Lim ...

  3. POJ--3321 Apple Tree(树状数组+dfs(序列))

    Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 22613 Accepted: 6875 Descripti ...

  4. POJ 3321:Apple Tree 树状数组

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 22131   Accepted: 6715 Descr ...

  5. E - Apple Tree(树状数组+DFS序)

    There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the tree. ...

  6. POJ 3321 Apple Tree 树状数组+DFS

    题意:一棵苹果树有n个结点,编号从1到n,根结点永远是1.该树有n-1条树枝,每条树枝连接两个结点.已知苹果只会结在树的结点处,而且每个结点最多只能结1个苹果.初始时每个结点处都有1个苹果.树的主人接 ...

  7. POJ3321 Apple Tree(树状数组)

    先做一次dfs求得每个节点为根的子树在树状数组中编号的起始值和结束值,再树状数组做区间查询 与单点更新. #include<cstdio> #include<iostream> ...

  8. POJ 3321 Apple Tree (树状数组+dfs序)

    题目链接:http://poj.org/problem?id=3321 给你n个点,n-1条边,1为根节点.给你m条操作,C操作是将x点变反(1变0,0变1),Q操作是询问x节点以及它子树的值之和.初 ...

  9. POJ 3321 Apple Tree 树状数组 第一题

    第一次做树状数组,这个东西还是蛮神奇的,通过一个简单的C数组就可以表示出整个序列的值,并且可以用logN的复杂度进行改值与求和. 这道题目我根本不知道怎么和树状数组扯上的关系,刚开始我想直接按图来遍历 ...

随机推荐

  1. 编写SDR SDRAM页突发模式控制器的注意点-下篇

    本来是没打算写这些的,但是后面逐渐发现点问题,所以决定再写一个下篇来补充说明一下. 图一 细心的网友会发现上篇末尾的打印是有点问题的,因为我的数据产生器产生的是1-200,1-200,1-200,1- ...

  2. [学习笔记]AJAX学习

    AJAX学习 ——在w3cschool学习AJAX的学习笔记 参考网站:w3cschool XMLHttpRequest 是 AJAX 的基础. XMLHttpRequest 对象 所有现代浏览器均支 ...

  3. AngularJs轻松入门(五)过滤器

    在前面几节里我们已经接触过AngularJs的表达式,表达式的作用是向视图中输出字面量或$scope对象中的属性值.在输出之前我们可以通过过滤器来格式化输出的数据. 过滤器的使用非常简单,我们看一下下 ...

  4. App开发Native.js入门指南

    概述 Native.js技术,简称NJS,是一种将手机操作系统的原生对象转义,映射为JS对象,在JS里编写原生代码的技术.如果说Node.js把js扩展到服务器世界,那么Native.js则把js扩展 ...

  5. 为什么 linux 上不能用 localhost 链接数据库?

         因为 linux 连接的时候不是通过 tcp 协议,而是通过 sockect 来连接.所以 写localhost 之后就会默认去找 sockect 链接[此文件在 /var/lib/mysq ...

  6. 守护、互斥锁、IPC和生产者消费者模型

    守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are ...

  7. 学习参考《Python基础教程(第3版)》中文PDF+英文PDF+源代码

    python基础教程ed3: 基础知识 列表和元组 字符串 字典 流程控制 抽象(参数 作用域 递归) 异常 魔术方法/特性/迭代器 模块/标准库 文件 GUI DB 网络编程 测试 扩展python ...

  8. write---向指定登录用户终端上发送信息

    write命令用于向指定登录用户终端上发送信息.通过write命令可传递信息给另一位登入系统的用户,当输入完毕后,键入EOF表示信息结束,write命令就会将信息传给对方.如果接收信息的用户不只登入本 ...

  9. Python组织文件 实践:拷贝某种类型的所有文件

    #! python3 #chapter09-test01- 遍历目录树,查找特定扩展名的文件不论这些文件的位置在哪里,都将他们 #拷贝到一个新的文件夹中 import os,shutil,pprint ...

  10. 【Codeforces Round #421 (Div. 2) B】Mister B and Angle in Polygon

    [题目链接]:http://codeforces.com/contest/820/problem/B [题意] 给你一个正n边形; 然后让你在这正n边行中选3个点,组成一个角; 找出角的大小和所给的角 ...