Apple Tree

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

  1. 2 1
  2. 0 11
  3. 1 2
  4. 3 2
  5. 0 1 2
  6. 1 2
  7. 1 3

Sample Output

  1. 11
  2. 2
  1. 【题意】
      一颗树,n个点(1-n),n-1条边,每个点上有一个权值,求从1出发,走V步,最多能遍历到的权值。
  2.  
  3. 【分析】
      这题做太久了我太傻逼了所以要写博客。
      

  每天都智障24小时。。一开始还看错范围,醉。。
  这题感觉很依赖,于是我首先打dfs序那种的树形依赖,然后发现我不会合并。
  于是我去打子树版本的,搞了超级久,整个一傻逼。
  首先问题是我们是可以往回走,所以设f[i][j][0]表示在点i的子树上走j步不往回走到i的最值,f[i][j][1]表示往回走。
  一个点的子树中不往回走只能有一个,注意不要漏啊不要重啊就好了。
  f[x][j][1]=max(f[x][j][1],f[y][l][1]+f[x][j-l-1][1])
  f[x][j][0]=max(f[x][j][0],f[y][l][0]+f[x][j-l][1])
  f[x][j][0]=max(f[x][j][0],f[y][l][1]+f[x][j-l-1][0])

  有一个地方就是一个子树假设大小是size[x],那么在这棵子树上走的步数不会超过2*size[x],因为每条边最多走两次(走下去走上去),所以可以for到子树大小的2倍,这样可以优化到n^2。

  感觉跟前面的依赖型还是有点不一样,dfs序版的就不能解决,貌似,因为啊回来不回来那个好难搞

代码如下:

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. #include<queue>
  7. #include<cmath>
  8. using namespace std;
  9. #define INF 0xfffffff
  10. #define Maxn 210
  11.  
  12. struct node
  13. {
  14. int x,y,next;
  15. }t[*Maxn];int len;
  16.  
  17. int n,k;
  18. int first[Maxn],a[Maxn];
  19.  
  20. int mymax(int x,int y) {return x>y?x:y;}
  21.  
  22. void ins(int x,int y)
  23. {
  24. t[++len].x=x;t[len].y=y;
  25. t[len].next=first[x];first[x]=len;
  26. }
  27.  
  28. int f[Maxn][Maxn][],ans;
  29.  
  30. void ffind(int x,int fa)
  31. {
  32. f[x][][]=f[x][][]=a[x];
  33. for(int i=first[x];i;i=t[i].next) if(t[i].y!=fa)
  34. {
  35. int y=t[i].y;
  36. ffind(y,x);
  37. for(int j=k;j>=;j--)
  38. {
  39. for(int l=;l<=j;l++)
  40. {
  41. f[x][j][]=mymax(f[x][j][],f[y][l][]+f[x][j-l-][]),//l+1
  42. f[x][j][]=mymax(f[x][j][],f[y][l][]+f[x][j-l][]),
  43. f[x][j][]=mymax(f[x][j][],f[y][l][]+f[x][j-l-][]);
  44. // f[x][l+1][0]=mymax(f[x][l+1][0],f[y][l][0]);
  45. }
  46. }
  47. }
  48. }
  49.  
  50. int main()
  51. {
  52. while(scanf("%d%d",&n,&k)!=EOF)
  53. {
  54. ans=-INF;
  55. k++;
  56. for(int i=;i<=n;i++) scanf("%d",&a[i]);
  57. len=;
  58. memset(first,,sizeof(first));
  59. for(int i=;i<n;i++)
  60. {
  61. int x,y;
  62. scanf("%d%d",&x,&y);
  63. ins(x,y);ins(y,x);
  64. }
  65. memset(f,-,sizeof(f));
  66. ffind(,);
  67. for(int i=;i<=k;i++) ans=mymax(ans,mymax(f[][i][],f[][i][]));
  68. printf("%d\n",ans);
  69. }
  70. return ;
  71. }

[POJ 2486]

2016-10-15 11:19:19

  1.  
  1.  

【POJ 2486】 Apple Tree (树形DP)的更多相关文章

  1. poj 2486 Apple Tree(树形DP 状态方程有点难想)

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

  2. POJ 2486 Apple Tree(树形DP)

    题目链接 树形DP很弱啊,开始看题,觉得貌似挺简单的,然后发现貌似还可以往回走...然后就不知道怎么做了... 看看了题解http://www.cnblogs.com/wuyiqi/archive/2 ...

  3. POJ 2486 Apple Tree (树形dp 经典题)

    #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const ...

  4. POJ 2486 Apple Tree (树形DP,树形背包)

    题意:给定一棵树图,一个人从点s出发,只能走K步,每个点都有一定数量的苹果,要求收集尽量多的苹果,输出最多苹果数. 思路: 既然是树,而且有限制k步,那么树形DP正好. 考虑1个点的情况:(1)可能在 ...

  5. POJ 2486 Apple Tree

    好抽象的树形DP......... Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6411 Accepte ...

  6. URAL_1018 Binary Apple Tree 树形DP+背包

    这个题目给定一棵树,以及树的每个树枝的苹果数量,要求在保留K个树枝的情况下最多能保留多少个苹果 一看就觉得是个树形DP,然后想出 dp[i][j]来表示第i个节点保留j个树枝的最大苹果数,但是在树形过 ...

  7. POJ 2486 Apple Tree(树形dp)

    http://poj.org/problem?id=2486 题意: 有n个点,每个点有一个权值,从1出发,走k步,最多能获得多少权值.(每个点只能获得一次) 思路: 从1点开始,往下dfs,对于每个 ...

  8. poj 2486 Apple Tree (树形背包dp)

    本文出自   http://blog.csdn.net/shuangde800 题目链接: poj-2486 题意 给一个n个节点的树,节点编号为1~n, 根节点为1, 每个节点有一个权值.    从 ...

  9. POJ 2486 Apple Tree ( 树型DP )

    #include <iostream> #include <cstring> #include <deque> using namespace std; #defi ...

随机推荐

  1. VOL.2 IE6,7,8(windows vista/7 x86/x64 )单文件版三连发,欢迎大家分享

    在上期 VOL.1 利用vmware ThinApp 制作非XP下可以运行的IE6 [无插件版](windows vista/7/8  x86/x64 )中,简要介绍了如何利用vmware Thina ...

  2. Vivado学习笔记_002

    经过几天的试用逐渐熟悉了vivado,和ISE相比vivado确实有了很多改良. 发现了以下几个特点:   1.数据格式统一了 在以往的设计中,保存数据的格式非常多.ISE有很多种格式的文件,在tra ...

  3. POJ3974 Palindrome

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  4. 面向服务的体系结构(service-oriented architecture,SOA)

    SOA的概念是Gartner 在1996年提出来的,并于2002年12月进一步提出SOA是“现代应用开发领域最重要的课题”.   一.SOA的定义 SOA分为广义的SOA和狭义的SOA,广义的SOA是 ...

  5. Android源码分析:HeaderViewListAdapter

    http://bj007.blog.51cto.com/1701577/643568 对于手机开发,我一直坚持的是“用iPhone的方式开发iPhone应用,用Android的方式开发Android应 ...

  6. js 函数命名

    1 函数命名可以使用匿名: var f=function(x){return x*2;} 2 可以使用变量: function double(x){return x*2;} 二者区别:后者会绑定到与其 ...

  7. ASP.NET MVC5总结(一)@HTML和对应的HTML

    HtmlHelper用来在视图中呈现 HTML 控件,主要分为以下几类: 1.ActionLink - 链接到操作方法 @Html.ActionLink("这是一个连接", &qu ...

  8. ios隐藏导航栏底线条和导航、状态栏浙变色

    方法一遍历法: 在你需要隐藏的地方调用如下代码 [self findlineviw:self.navigationBar].hidden = YES; -(UIImageView*)findlinev ...

  9. .NET 设计模式之单例模式(一)

    1.简单解释:在创建对象时,无论创建多少次,在堆空间上只会申请一次内存空间. 2.例子(1): public class Singleton{ private static Singleton _si ...

  10. windows server 2003 取消登录Ctrl+Alt+delete

    安装Windows Server 2003操作系统的, 在console登录默认要先按下Ctrl+Alt+Delete组合键然后才弹出登录对话框 要取消这个限制的方法是: 点击 “开始-->运行 ...