hdu1011 和 hdu1561类似,给定每个节点的花费以及价值,并且子节点必须在父亲节点取到以后才可以被取到

相当于是在树上进行的01背包

dp时考虑每一个子树 root和它的每一个儿子,状态转移方程为

dp[root][j]=max(dp[root][j],dp[root][j-k]+dp[ son[p] ][ k ])

以下为ac代码

hdu1011:这题有一个小坑,最后必须要剩余至少一个人。。开始没考虑到,一直wa

  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<stdlib.h>
  4. #include<math.h>
  5. #include<ctype.h>
  6. #include<algorithm>
  7. #include<string>
  8. #include<string.h>
  9. #include<queue>
  10. #define mod 1000000007
  11. #define MAX 100000000
  12. using namespace std;
  13. int t,n,m,p,k,tt;
  14. int map[][];
  15. int dp[][];
  16. int a[];
  17. int w[];
  18. int vi[];
  19. void dfs(int s)
  20. {
  21. vi[s]=;
  22. int cost=(w[s]+)/;
  23. for(int i=cost;i<=m;i++)
  24. dp[s][i]=a[s];
  25. for(int i=;i<=n;i++)
  26. {
  27. if(!map[s][i])
  28. continue;
  29. if(vi[i])
  30. continue;
  31. dfs(i);
  32. for(int k=m;k>=cost;k--)
  33. for(int j=;j+cost<=k;j++)
  34. dp[s][k]=max(dp[s][k],dp[s][k-j]+dp[i][j]);
  35.  
  36. }
  37. }
  38. int main()
  39. {
  40. while(scanf("%d%d",&n,&m)&&(n!=-||m!=-))
  41. {
  42. int x,y;
  43. memset(map,,sizeof(map));
  44. memset(dp,,sizeof(dp));
  45. memset(vi,,sizeof(vi));
  46. a[]=;
  47. for(int i=;i<=n;i++)
  48. {
  49. scanf("%d%d",w+i,a+i);
  50. }
  51. for(int i=;i<n;i++)
  52. {
  53. scanf("%d%d",&x,&y);
  54. map[x][y]=;
  55. map[y][x]=;
  56. }
  57. if(m==)
  58. {
  59. puts("");
  60. continue;
  61. }
  62. dfs();
  63. printf("%d\n",dp[][m]);
  64. }
  65. return ;
  66. }

hdu 1561

  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<stdlib.h>
  4. #include<math.h>
  5. #include<ctype.h>
  6. #include<algorithm>
  7. #include<string>
  8. #include<string.h>
  9. #include<queue>
  10. #define mod 1000000007
  11. #define MAX 100000000
  12. using namespace std;
  13. int t,n,m,p,k,tt;
  14. int map[][];
  15. int dp[][];
  16. int a[];
  17. void dfs(int s)
  18. {
  19. for(int j=;j<=m+;j++)
  20. dp[s][j]=a[s];
  21. for(int i=;i<=n;i++)
  22. {
  23. if(!map[s][i])
  24. continue;
  25. dfs(i);
  26. for(int k=m+;k>=;k--)
  27. for(int j=;j+<=k;j++)
  28. dp[s][k]=max(dp[s][k],dp[s][k-j]+dp[i][j]);
  29.  
  30. }
  31.  
  32. }
  33. int main()
  34. {
  35. while(scanf("%d%d",&n,&m)&&(n+m))
  36. {
  37. memset(map,,sizeof(map));
  38. memset(dp,,sizeof(dp));
  39. int x;
  40. a[]=;
  41. for(int i=;i<=n;i++)
  42. {
  43. scanf("%d",&x);
  44. map[x][i]=;
  45. scanf("%d",a+i);
  46. }
  47. dfs();
  48. printf("%d\n",dp[][m+]);
  49. }
  50. return ;
  51. }

树形dp入门练习(hdu1011+hdu1061)的更多相关文章

  1. POJ 2342 树形DP入门题

    有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...

  2. 树形dp 入门

    今天学了树形dp,发现树形dp就是入门难一些,于是好心的我便立志要发一篇树形dp入门的博客了. 树形dp的概念什么的,相信大家都已经明白,这里就不再多说.直接上例题. 一.常规树形DP P1352 没 ...

  3. 树形DP入门详解+题目推荐

    树形DP.这是个什么东西?为什么叫这个名字?跟其他DP有什么区别? 相信很多初学者在刚刚接触一种新思想的时候都会有这种问题. 没错,树形DP准确的说是一种DP的思想,将DP建立在树状结构的基础上. 既 ...

  4. [poj2342]Anniversary party树形dp入门

    题意:选出不含直接上下司关系的最大价值. 解题关键:树形dp入门题,注意怎么找出根节点,运用了并查集的思想. 转移方程:dp[i][1]+=dp[j][0];/i是j的子树 dp[i][0]+=max ...

  5. LuoGu-P1122 最大子树和+树形dp入门

    传送门 题意:在一个树上,每个加点都有一个值,求最大的子树和. 思路:据说是树形dp入门. 用dfs,跑一边,回溯的时候求和,若和为负数,则减掉,下次不记录这个节点. #include <ios ...

  6. (树形DP入门题)Anniversary party(没有上司的舞会) HDU - 1520

    题意: 有个公司要举行一场晚会.为了让到会的每个人不受他的直接上司约束而能玩得开心,公司领导决定:如果邀请了某个人,那么一定不会再邀请他的直接的上司,但该人的上司的上司,上司的上司的上司等都可以邀请. ...

  7. hdu_Anniversary party_(树形DP入门题)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意:有N个人,N-1个人有自己的上司,每个人有一个快乐值,如果这个人参加了聚会,那么这个人的直 ...

  8. 树形DP入门题目推荐以及解析

    关于树形DP几道入门题目 今天恶补树形DP,感觉海星. 其实挺简单的. 介绍几道例题,我会的. 1.洛谷P1352 没有上司的舞会 我的一篇题解 我们可以考虑每一个节点都是有两种情况. 一个是被邀请: ...

  9. 树形DP入门学习

    这里是学习韦神的6道入门树形dp进行入门,本来应放在day12&&13里,但感觉这个应该单独放出来好点. 这里大部分题目都是参考的韦神的思想. A - Anniversary part ...

  10. HDU 1561 树形DP入门

    The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

随机推荐

  1. [Angular 2] Rendering an Observable with the Async Pipe

    Angular 2 templates use a special Async pipe to be able to render out Observables. This lesson cover ...

  2. VideoView 视频播放 示例

    介绍 实现的功能: 可播放本地视频或网络视频,可控制播放或暂停 最小化时保存播放位置及播放状态,resume时恢复所有状态: 横竖屏切换时保持切换前的位置及状态 在屏幕上竖直滑动可调节屏幕亮度和音量 ...

  3. 黑信 socket即时通讯 示例

    整个过程 首先开启服务器 打开一个SDK大于4.4的手机---B 打开一个SDK小于4.4的手机---A 相互发送一条消息,对方就可以收到,当然这些消息都是通过服务器[转发]过来的 MainActiv ...

  4. Asp.Net Mvc MapRoute .html不起作用(转)

    RegisterRoutes 注册路由示例配置: public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRo ...

  5. component object model(组件对象模型)

    通常,COM是以 win32动态链接库(dll)或可执行文件(exe)的形式发布. 在COM中,接口就是一切,对于客户来说,一个组件就是一个接口集.COM接口是一个包含一个函数指针数组的内存结构. 组 ...

  6. shell中if做比较

    比较两个字符串是否相等的办法是: if [ "$test"x = "test"x ]; then 这里的关键有几点: 1 使用单个等号 2 注意到等号两边各有一 ...

  7. 武汉科技大学ACM :1005: C语言程序设计教程(第三版)课后习题6.6

    Problem Description 打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身. 例如:153是一个水仙花数,因为1 ...

  8. IO流(随机流,数组内存流

    File file1=new File("test1.txt"); RandomAccessFile in2=new RandomAccessFile(file1,"rw ...

  9. CentOS下几种软件安装方式

    1.rpmRPM RedHat Package Manager(RedHat软件包管理工具)的缩写,这一文件格式名称虽然打上了RedHat的标志, 但是其原始设计理念是开放式的,现在包括OpenLin ...

  10. phpcms v9 二次开发 - 自己添加源文件

    一.在根目录添加入口文件, 我现在要在根目录添加一个文件名为test.php 这样一个文件,为了调用系统的公用类和函数,必须加入一下包含文件 test.php代码如下 <?phpdefine(' ...