http://poj.org/problem?id=2486

典型的回溯题目:特别是状态方程用三维的来标记是否要走回路。

  1. 题意:一颗树,n个点(1-n),n-1条边,每个点上有一个权值,求从1出发,走V步,最多能遍历到的权值
  1. 思路:

树形dp,比较经典的一个树形dp。首先很容易就可以想到用dp[root][k]表示以root为根的子树中最多走k时所能获得的最多苹果数,接下去我们很习惯地会想到将k步在root的所有子结点中分配,也就是进行一次背包,就可以得出此时状态的最优解了,但是这里还有一个问题,那就是在进行背包的时候,对于某个孩子son走完之后是否回到根结点会对后面是否还能分配有影响,为了解决这个问题,我们只需要在状态中增加一维就可以了,用dp[root][k][0]表示在子树root中最多走k步,最后还是回到root处的最大值,dp[root][k][1]表示在子树root中最多走k步,最后不回到root处的最大值。由此就可以得出状态转移方程了:

Apple Tree
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 6836   Accepted: 2268

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

dp[root][j][0] = MAX (dp[root][j][0] , dp[root][j-k][0] + dp[son][k-2][0]);//从s出发,要回到s,需要多走两步s-t,t-s,分配给t子树k步,其他子树j-k步,都返回

dp[root][j]][1] = MAX(  dp[root][j][1] , dp[root][j-k][0] + dp[son][k-1][1]) ;//先遍历s的其他子树,回到s,遍历t子树,在当前子树t不返回,多走一步

dp[root][j][1] = MAX (dp[root][j][1] , dp[root][j-k][1] + dp[son][k-2][0]);//不回到s(去s的其他子树),在t子树返回,同样有多出两步

  1. //(1)dp[i][j+2][0] = max(dp[i][j+2][0], dp[i][j-k][0]+dp[son][k][0]);
  2. //(2)dp[i][j+1][1] = max(dp[i][j+1][1], dp[i][j-k][0]+dp[son][k][1]); 人留在i的子节点son的子树中
  3. //(3)dp[i][j+2][1] = max(dp[i][j+2][1], dp[i][j-k][1]+dp[son][k][0]); 人留在不是son的i的子节点的子树中
  4. #include<iostream>
  5. #include<cstring>
  6. #include<cstdio>
  7. using namespace std;
  8. int dp[300][300][3],head[300],vis[300],w[300];
  9. int len,n,k;
  10. struct node
  11. {
  12. int now,next;
  13. } tree[505];
  14. int max(int x,int y)
  15. {
  16. if(x>y)
  17. return x;
  18. else
  19. return y;
  20. }
  21. void add(int x,int y)
  22. {
  23.  
  24. tree[len].now = y;
  25. tree[len].next = head[x];
  26. head[x] = len++;
  27. }
  28. void dfs(int root,int mark)
  29. {
  30. int j,son,t,i;
  31.  
  32. for(i=0;i<=k;i++)
  33. dp[root][i][0] = dp[root][i][1] = w[root];
  34. for(i=head[root];i!=-1;i=tree[i].next)
  35. {
  36. printf("i=%d\n",i);
  37. son = tree[i].now;
  38. if(son == mark)//已经加了,就不要加,不然就死循环。
  39. continue;
  40. dfs(son,root);
  41. for(j = k; j>=1; j--)
  42. {
  43. for(t = 1; t<=j; t++)
  44. {
  45. dp[root][j][1]=max(dp[root][j][1],dp[root][j-t][1]+dp[son][t-2][1]);
  46. dp[root][j][0]=max(dp[root][j][0],dp[root][j-t][1]+dp[son][t-1][0]);
  47. dp[root][j][0]=max(dp[root][j][0],dp[root][j-t][0]+dp[son][t-2][1]);
  48.  
  49. }
  50. }
  51.  
  52. }
  53. }
  54. int main()
  55. {
  56. int i,a,b,j;
  57. while(~scanf("%d%d",&n,&k))
  58. {
  59. len=0;
  60. memset(head,-1,sizeof(head));
  61. memset(dp,0,sizeof(dp));
  62. memset(vis,0,sizeof(vis));
  63. memset(w,0,sizeof(w));
  64. for(i = 1; i<=n; i++)
  65. {
  66. scanf("%d",&w[i]);
  67.  
  68. }
  69. for(i=1;i<n;i++)
  70. {
  71. cin>>a>>b;
  72. add(a,b);
  73. add(b,a);
  74. }
  75. dfs(1,0);
  76. printf("%d\n",max(dp[1][k][0],dp[1][k][1]));
  77. }
  78. return 0;
  79. }

poj 2408 Apple Tree的更多相关文章

  1. POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)

    POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...

  2. POJ - 3321 Apple Tree (线段树 + 建树 + 思维转换)

    id=10486" target="_blank" style="color:blue; text-decoration:none">POJ - ...

  3. POJ 2486 Apple Tree

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

  4. poj 3321:Apple Tree(树状数组,提高题)

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18623   Accepted: 5629 Descr ...

  5. poj 3321 Apple Tree dfs序+线段树

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K       Description There is an apple tree outsid ...

  6. POJ 3321 Apple Tree(DFS序+线段树单点修改区间查询)

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 25904   Accepted: 7682 Descr ...

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

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

  8. POJ 3321 Apple Tree 【树状数组+建树】

    题目链接:http://poj.org/problem?id=3321 Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submiss ...

  9. #5 DIV2 A POJ 3321 Apple Tree 摘苹果 构建线段树

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 25232   Accepted: 7503 Descr ...

随机推荐

  1. Java_Activiti5_菜鸟也来学Activiti5工作流_之初识常用服务类和数据表(二)

    /** * 代码清单中使用 ProcessEngines类加载默认的流程配置文件(activiti.cfg.xml),再获取各个服务组件的实例. * RepositoryService主要用于管理流程 ...

  2. 自己写的自动生成动态边框的jquery小插件

    思路就是在元素四周添加<ul>列表,然后周期性地改变它的颜色,实现动态的效果,不支持ie7.ie8 预览链接http://gorey.sinaapp.com/myBorder/border ...

  3. 在企业级开发中使用Try...Catch...会影响效率吗?

    感谢神啊.上帝及老天爷让我失眠,才能够有了本篇文章. 记得不久之前,公司一同事曾经说过:“如果是Winform开发,由于程序是在本地,使用try...catch不会有太大性能问题,可是如果是在web服 ...

  4. 取出当前会话的sid等

    select distinct sess.SID     db_sid,                sess.SERIAL# db_serial#,                process. ...

  5. LNMP安装WordPress3.4.2看不到主题解决方法

    喜欢LNMP配置环境的朋友,又是wordpress建立的博客程序,安装之后发现一个问题在网站后台看不到模板主题,重新下载了一款新的主题也查看不了.开始以为是程序的问题,于是我重新下载新版本的WordP ...

  6. Spring(一)简述(转载)

    原文出自:http://www.cnblogs.com/liunanjava/p/4396794.html 一.Spring简述 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量 ...

  7. dede操作成功信息提示修改

    函数修改 include/common.func.php 文件 function ShowMsg()函数

  8. Python自动化运维之26、Web框架本质、MVC与MTV

    一.Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python #coding:ut ...

  9. ipython与python的区别

    http://mba.shengwushibie.com/itbook/BookChapter.asp?id=8745 http://www.cnblogs.com/yangze/archive/20 ...

  10. 关于set或map的key使用自定义类型的问题

    我们都知道set或map的key使用自定义类型时必须重载<关系运算符 但是,还有一个条件,所调用重载的小于操作符,使用的对象必须是const 而对象调用的方法也必须是const的 1 #incl ...