一个简单的树上的背包问题。

代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <algorithm>
  7. #include <string>
  8. #include <queue>
  9. #include <stack>
  10. #include <vector>
  11. #include <map>
  12. #include <set>
  13. #include <functional>
  14. #include <cctype>
  15. #include <time.h>
  16.  
  17. using namespace std;
  18.  
  19. const int INF = <<;
  20.  
  21. struct Graph {
  22. static const int MAXN = ;
  23. static const int MAXM = MAXN*;
  24.  
  25. int head[MAXN];
  26. int next[MAXM], to[MAXM], use;
  27.  
  28. int val[MAXN], size[MAXN];
  29. int m;
  30.  
  31. void init(int n, int m) {
  32. memset(head, -, sizeof(head));
  33. use = ;
  34.  
  35. this->m = m;
  36. for (int i = ; i <= n; i++) scanf("%d", &val[i]);
  37. int u, v;
  38. for (int i = ; i < n; i++) {
  39. scanf("%d%d", &u, &v);
  40. addEdge(u, v);
  41. addEdge(v, u);
  42. }
  43. }
  44.  
  45. inline void addEdge(int u, int v) {
  46. next[use] = head[u];
  47. to[use] = v;
  48. head[u] = use++;
  49. }
  50.  
  51. int dp[MAXN][MAXN];
  52.  
  53. void dfs(int u, int pre) {
  54. memset(dp[u], , sizeof(dp[u]));
  55. size[u] = ;
  56. for (int p = head[u]; p != -; p = next[p]) {
  57. int v = to[p];
  58. if (v==pre) continue;
  59. dfs(v, u);
  60. size[u] += size[v];
  61. }
  62. dp[u][] = val[u];
  63. for (int p = head[u]; p != -; p = next[p]) {
  64. int v = to[p];
  65. if (v==pre) continue;
  66. for (int i = size[u]; i > ; i--)
  67. for (int j = ; j <= size[v]; j++) {
  68. if (i+j>size[u]) break;
  69. dp[u][i+j] = max(dp[u][i+j], dp[u][i]+dp[v][j]);
  70. }
  71. }
  72. }
  73.  
  74. void solve() {
  75. int ans = ;
  76. dfs(, );
  77. for (int i = ; i <= m; i++)
  78. ans = max(ans, dp[][i]);
  79. printf("%d\n", ans);
  80. }
  81. }solver;
  82.  
  83. int main() {
  84. #ifdef Phantom01
  85. freopen("1055.txt", "r", stdin);
  86. #endif //Phantom01
  87.  
  88. int n, m;
  89. while (scanf("%d%d", &n, &m)!=EOF) {
  90. solver.init(n, m);
  91. solver.solve();
  92. }
  93.  
  94. return ;
  95. }

hiho 1055 刷油漆 树形dp的更多相关文章

  1. hihoCoder #1055 : 刷油漆 [ 树形dp ]

    传送门 结果:Accepted     提交时间:2015-05-11 10:36:08 #1055 : 刷油漆 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到 ...

  2. HihoCoder 1055 : 刷油漆 树形DP第一题(对象 点)

    刷油漆 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho有着一棵灰常好玩的树玩具!这棵树玩具是由N个小球和N-1根木棍拼凑而成,这N个小球都被小Ho标上了 ...

  3. hiho #1055 : 刷油漆

    上回说到,小Ho有着一棵灰常好玩的树玩具!这棵树玩具是由N个小球和N-1根木棍拼凑而成,这N个小球都被小Ho标上了不同的数字,并且这些数字都是处于1..N的范围之内,每根木棍都连接着两个不同的小球,并 ...

  4. hihoCoder hiho一下 第十二周 #1055 : 刷油漆 (树上DP)

    思路: 只能刷部分节点数m,总节点数n.如果m>=n那么就可以全刷了,那就不用任何算法了.如果m<n那么就要有取舍了.用DP思路,记录下每个节点如果获得到1~m个选择所能获得的最大权值.这 ...

  5. 格子刷油漆(dp)-----------蓝桥备战系列

    标题:格子刷油漆 X国的一段古城墙的顶端可以看成 2*N个格子组成的矩形(如图1所示),现需要把这些格子刷上保护漆. 你可以从任意一个格子刷起,刷完一格,可以移动到和它相邻的格子(对角相邻也算数),但 ...

  6. hihoCoder#1055 : 刷油漆 (树形DP+01背包)

    题目大意:给一棵带点权的树,现在要从根节点开始选出m个连通的节点,使总权值最大. 题目分析:定义状态dp(u,m)表示在以u为根的子树从根节点开始选出m个点连通的最大总权值,则dp(u,m)=max( ...

  7. [hihoCoder] #1055 : 刷油漆

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho有着一棵灰常好玩的树玩具!这棵树玩具是由N个小球和N-1根木棍拼凑而成,这N个小球都被小Ho标上了不同的数 ...

  8. HihoCoder 1055 刷油漆 (树上背包)

    题目:https://vjudge.net/contest/323605#problem/A 题意:一棵树,让你选择m个点的一个连通块,使得得到的权值最大 思路:树上背包,我们用一个dp数组,dp[i ...

  9. HihoCoder第十二周:刷油漆

    #1055 : 刷油漆 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho有着一棵灰常好玩的树玩具!这棵树玩具是由N个小球和N-1根木棍拼凑而成,这N个小球 ...

随机推荐

  1. Java文件(io)编程——文件字节流的使用

    案例1: 演示FileInputStream类的使用(用FileInputStream的对象把文件读入到内存) 首先要在E盘新建一个文本文件,命名为test.txt,输入若干字符 public cla ...

  2. windows 路由

    route ? 查看帮助 route print 查看路由表 添加一条路由: route add 10.10.10.0 mask 255.255.255.0  192.168.1.1 #到达10.10 ...

  3. SpringBoot学习笔记(9)----SpringBoot中使用关系型数据库以及事务处理

    在实际的运用开发中,跟数据库之间的交互是必不可少的,SpringBoot也提供了两种跟数据库交互的方式. 1. 使用JdbcTemplate 在SpringBoot中提供了JdbcTemplate模板 ...

  4. S-T表学习笔记

    $O(nlogn)$构造$O(1)$查询真是太强辣 然而不支持修改= = ShØut! #include<iostream> #include<cstring> #includ ...

  5. codeforces 914 D Bash and a Tough Math Puzzle

    #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #i ...

  6. Qt之布局管理器

    简述 Qt的布局系统提供了一个简单的和强有力的方式,来自动排列窗口子控件布局. 所有QWidget子类可以使用布局来管理他们的子控件.QWidget::setLayout()函数可以为一个控件布局.当 ...

  7. Qt之QNetworkProxy(网络代理)

    简述 QNetworkProxy类提供了一个网络层代理. QNetworkProxy提供了配置网络层代理支持Qt网络类的方法.目前支持的类有QAbstractSocket.QTcpSocket.QUd ...

  8. 使用sh运行bash脚本的奇怪问题

    在同一个文件夹下有两个脚本.a.sh和b.sh,脚本内容例如以下: a.sh: echo "test for a" source b.sh b.sh: echo "tes ...

  9. 程序员之--C语言细节13(二维数组和指针,&amp;*a[i][0]的理解,数组1[e]和e[1]非常可能你没见过)

    主要内容:二维数组和指针.&*a[i][0]的理解.数组1[e]和e[1] #include <stdio.h> #define NUM_ROWS 10 #define NUM_C ...

  10. hibernate动态表名映射--仅仅有想不到,没有做不到

    近期的一个项目有一个需求,有N个考核单位,要对每一个考核单位生成一张考核情况表.这样做的目的是横切数据库,这这个需求的实现中,我的组员遇到了一个技术问题,我将我的解决的方法和整个思考过程与大家分享, ...