有的堡垒攻克需要攻克另一个堡垒,形成一个森林,最多攻克m个堡垒,求获得宝物的最大价值。

1,以0做根将森林形成树;

2,用背包计算当前节点下需要攻克k个堡垒能获得的宝物最大价值,但是注意同一个根节点的情况不能够先后放入背包,否则会有比如1节点选2个和选三个形成了选5个,也就是某些节点重复计算了。所以要在back第j格时将所有种k依次放入,j--;

  1. #include<iostream>
  2. #include<string.h>
  3. #include<stdio.h>
  4. #include<vector>
  5. using namespace std;
  6. const int maxa = ;
  7. int dp[maxa][maxa];
  8. int back[maxa][maxa];
  9. int vis[maxa][maxa];
  10. int v[maxa];
  11. vector<int> edge[maxa];
  12. int numb[maxa];
  13. int dfs(int x, int num ){//printf("%d %d\n", x, num);
  14. if(vis[x][num] || num == )
  15. return dp[x][num];
  16. memset(back[x], , sizeof(back[x]));
  17. for(int i = ; i < edge[x].size(); i ++){
  18. int k = edge[x][i];//printf("%d ", k);
  19. int last = -;
  20. for(int h = num-; h >= ; h--){
  21. for(int j = ; j <= h && j <= numb[k]; j++){
  22. int a = dfs(k, j);
  23. back[x][h] = max(back[x][h], back[x][h-j] + a);//printf("%d ", back[h]);
  24. }//puts("");
  25. }
  26. }
  27. vis[x][num] = ;
  28. return dp[x][num] = back[x][num-]+v[x];
  29. }
  30. int dfs1(int x){
  31. int sum = ;
  32. for(int i = ; i < edge[x].size(); i++){
  33. int k = edge[x][i];
  34. sum += dfs1(k);
  35. }
  36. return numb[x] = sum +;
  37. }
  38. int main(){
  39. int n, m;
  40. //freopen("in.cpp", "r", stdin);
  41. while(scanf("%d%d", &n, &m), n+m){
  42. memset(vis, , sizeof(vis));
  43. for(int i =; i <= n; i++)
  44. edge[i].clear();
  45. for(int i =; i <= n; i++){
  46. int a, b;
  47. scanf("%d%d", &a, &b);
  48. v[i] = b;
  49. edge[a].push_back(i);
  50. }
  51. dfs1();
  52. memset(dp, , sizeof(dp));
  53. printf("%d\n", dfs(, m+));
  54. /* for(int i = 0; i <= n; i++){
  55. printf("*%d ", numb[i]);
  56. }*/
  57. }
  58. }

树形dp hdu1561的更多相关文章

  1. 【树形dp小练】HDU1520 HDU2196 HDU1561 HDU3534

    [树形dp]就是在树上做的一些dp之类的递推,由于一般须要递归处理.因此平庸情况的处理可能须要理清思路.昨晚開始切了4题,作为入门训练.题目都很easy.可是似乎做起来都还口以- hdu1520 An ...

  2. hdu1561 The more, The Better (树形dp+背包)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...

  3. 树形dp专辑

    hdu 2196 http://acm.hdu.edu.cn/showproblem.php?pid=2196 input 5//5个结点 1 1//表示结点2到结点1有一条权值为1的边 2 1//表 ...

  4. 树形动态规划(树形DP)入门问题—初探 & 训练

    树形DP入门 poj 2342 Anniversary party   先来个题入门一下~ 题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上 ...

  5. 树形DP小结

    树形DP1.简介:树是一种数据结构,因为树具有良好的子结构,而恰好DP是从最优子问题更新而来,那么在树上做DP操作就是从树的根节点开始深搜(也就是记忆化搜索),保存每一步的最优结果.tips:树的遍历 ...

  6. 树形 DP 总结

    树形 DP 总结 本文转自:http://blog.csdn.net/angon823/article/details/52334548 介绍 1.什么是树型动态规划 顾名思义,树型动态规划就是在“树 ...

  7. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  8. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  9. 【BZOJ-4726】Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

随机推荐

  1. php读取memcache二进制数据

    memcache作为一个数据中间层,经常用来做数据交换. 比如在某个系统内部我们规定如下的用户状态的信息,每个用户只需要存续52个字节. Key state#ID 如”state#10888” Val ...

  2. 【学习笔记】【Foundation】数组

    数组:可重复,有序 不可变数组 创建数组 //array开头的方法是类方法,init开头的是实例方法 //NSArray* arr=[[NSArray alloc]initWithObjects:@& ...

  3. [转] c#多线程(UI线程,控件显示更新) Invoke和BeginInvoke 区别

    如果只是直接使用子线程访问UI控件,直接看内容三,如果想深入了解从内容一看起. 一.Control.Invoke和BeginInvoke方法的区别 先上总结: Control.Invoke 方法 (D ...

  4. 《EM-PLANT仿真技术教程》读书笔记(持续更新中)

    1.在系统分析过程中,必须考虑系统所处的环境,因此划分系统与环境的边界是系统分析的首要任务 2.模型可以分为物理模型和数学模型.数学模型可以分为解析模型.逻辑模型.网络模型以及仿真模型.模型可以分为离 ...

  5. STL,ATL,WTL的联系与区别

    STL   即   Standard   Template   Library         STL(标准模板库)是惠普实验室开发的一系列软件的统称.它是由Alexander   Stepanov. ...

  6. CentOS 6.4 编译Open vSwitch2.0

    1. 安装依赖软件 yum install automake openssl-devel rpmrebuild kernel-devel make redhat-rpm-config gcc redh ...

  7. DES加解密实现方式

    private static readonly byte[] _keys = { 0x22, 0x84, 0x56, 0x98, 0x90, 0xAB, 0xpD, 0xEF }; private s ...

  8. 《Node.js开发指南》知识整理

    Node.js简介 Node是一个可以让JavaScript运行在服务器端的平台,抛弃了传统平台依靠多线程来实现高并发的设计思路,而采用单线程.异步式I/O.事件驱动式的程序设计模型. 安装和配置No ...

  9. 关于Python中的for循环控制语句

    #第一个:求 50 - 100 之间的质数 import mathfor i in range(50, 100 + 1):    for j in range(2, int(math.sqrt(i)) ...

  10. convert app to 64-bit for ios7

    https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/Introd ...