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. UI组件之AdapterView及其子类(四)Gallery画廊控件使用

    听说 Gallery如今已经不使用了,API使用ViewPaper取代了,以后再学专研ViewPaper吧如今说说Gallery画廊,就是不停显示图片的意思 Gallery是用来水平滚动的显示一系列项 ...

  2. 疯狂java讲义之数据类型与运算符

    Java是一门强类型语言 所有变量必须先声明.后使用 指定类型的变量只能接受类型匹配的值 注释 @author 作者 @version 版本 @param 方法参数 @return 返回值 标识符与关 ...

  3. Struts2标签库整理【完整】

    转自:https://blog.csdn.net/chen_zw/article/details/8161230   Struts2标签库提供了主题.模板支持,极大地简化了视图页面的编写,而且,str ...

  4. 图论之堆优化的Prim

    本题模板,最小生成树,洛谷P3366 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边 ...

  5. POJ 3670 DP LIS?

    权值为1~3 好了 此题是水题-- i表示到了第i个数,j表示结尾的数是j f[i][j]=min(f[i][j],f[i-1][k]+(a[i]!=j)) 1<=k<=j 最长上升的. ...

  6. 关于Mantle使用个人的一些见解

    前一个月,我接触到了Mantle,由于项目采用的是MVC的设计模式,选用好的model也是至关重要的.先介绍下Mantle的使用吧. 首先定义好数据模型: @property (nonatomic, ...

  7. MySQL5.6主从复制方案

    MySQL5.6主从复制方案 1.主备服务器操作 环境:CentOS 6.3/6.4 最小化缺省安装,配置好网卡. 安装MySQL前,确认Internet连接正常,以便下载安装文件. # 新增用户组 ...

  8. js数组去重问题

    1. 双层循环:外层循环,内层比较值: (1)利用splice直接在原数组进行操作 Array.prototype.delRepeat = function (){ var arr = this; v ...

  9. [NOIP2009提高组]最优贸易

    题目:洛谷P1073.Vijos P1754.codevs1173. 题目大意:有n点m边的图,边分有向和无向.每个点有一个价格,用这个价格可以买入或卖出一个东西.一个人从1出发,要到n,途中可以买入 ...

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

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