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. javascript中如何获取对象名

    javascript中如何获取对象名 一.总结 一句话总结:将对象传入参数,看参数是否为函数(js中的对象和函数是一个意思么(函数肯定是对象)),对象参数.name属性即可获得 //版本4 funct ...

  2. rest_framework-解析器-总结完结篇

    感谢alex和武老师 前戏: Djaogo对请求体只支持 application/x-www-form-urlencoded请求头以及name=alex&age=18的数据格式 django. ...

  3. 【DNN发布包解释】package 包裹

    package 包裹 owner 主人 dependency 附属国 azureCompatible 天青兼容 releaseNotes  发行说明 license 许可证 CoreVersion 核 ...

  4. AngularJs轻松入门(三)MVC架构

    MVC应用程序架构最早于1970年起源于Smalltalk语言,后来在桌面应用程序开发中使用较为广泛,如今在WEB开发中也非常流行.MVC的核心思想是將数据的管理(Model).业务逻辑控制(Cont ...

  5. js字符串首字母转为大写

    function initialsLetterUpperCase(arr){ if(Array.isArray(arr)){ return arr.map(function(val,index,arr ...

  6. linux下搭建NFS服务器

    服务端:10.6.191.183 客户端:10.6.191.182 NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984 ...

  7. [转载]CentOS 7虚拟机下设置固定IP详解

    在 复制 他人作品之前,是因为我再此“跌倒”过一次,虽然原主说是永久地址,但是地址失效 不可避免.所以就原封不动的copy了过来,我自己也是按照他的一步一步配置的,我成功了,相信你们也会成功. 如果不 ...

  8. lsof---查看你进程开打的文件

    lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP.UDP).找回/恢复删除的文件.是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户 ...

  9. CsGL着色的三角形

    转自NeHe教程 public override void Draw() { // Here's Where We Do All The Drawing glClear(GL_COLOR_BUFFER ...

  10. Delphi的参数修饰const/var/output 与C++的对应关系

    delphi的const/input和默认的没有修饰, C++都是一样的 delphi的var,对应C++那边是指针,  调用方需要管理内存(负责分配内存及销毁) delphi的output , 对应 ...