题目链接

题目描述

有一棵点数为 \(N\) 的树,树边有边权。给你一个在 \(0~ N\) 之内的正整数 \(K\) ,你要在这棵树中选择 \(K\)个点,将其染成黑色,并将其他 的\(N-K\)个点染成白色 。 将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间的距离的和的受益。问受益最大值是多少。

题解

有点难想的dp 我果然太菜了

%%%__stdcall

\(f[i][j]\) 为以\(i\)为根的子树, 选了染了\(j\)个黑点的最大贡献

然后就是树形背包。。

siz[u]为以u为根的子树大小


  1. for (int j = Min(K, siz[u]); j >= 0; j--)
  2. for (int k = 0; k <= Min(j, siz[v]); k++)
  3. if (f[u][j-k] >= 0) {
  4. long long val = 1ll*k*(K-k)*g[i].w + 1ll*(siz[v]-k)*(n-K+k-siz[v])*g[i].w;
  5. f[u][j] = Max(f[u][j], f[u][j-k] + f[v][k] + val);
  6. }

贡献为子树贡献加上该边的贡献(子树黑点个数 * 其它黑点个数 * 边权 + 子树白点个数 * 其它白点个数 * 边权 )

Code


  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define RG register
  4. using namespace std;
  5. inline int gi() {
  6. int f = 1, s = 0;
  7. char c = getchar();
  8. while (c != '-' && (c < '0' || c > '9')) c = getchar();
  9. if (c == '-') f = -1, c = getchar();
  10. while (c >= '0' && c <= '9') s = s*10+c-'0', c = getchar();
  11. return f == 1 ? s : -s;
  12. }
  13. const int N = 2010;
  14. struct node {
  15. int to, next, w;
  16. }g[N<<1];
  17. int last[N], gl;
  18. inline void add(int z, int x, int y) {
  19. g[++gl] = (node) {y, last[x], z};
  20. last[x] = gl;
  21. g[++gl] = (node) {x, last[y], z};
  22. last[y] = gl;
  23. return ;
  24. }
  25. int siz[N], n, K;
  26. long long f[N][N];
  27. inline void init(int u, int fa) {
  28. siz[u] = 1;
  29. for (int i = last[u]; i; i = g[i].next) {
  30. int v = g[i].to;
  31. if (v == fa) continue;
  32. init(v, u);
  33. siz[u] += siz[v];
  34. }
  35. return ;
  36. }
  37. #define Min(x, y) ((x<y)?x:y)
  38. #define Max(x, y) ((x>y)?x:y)
  39. inline void dfs(int u, int fa) {
  40. memset(f[u], 128, sizeof(f[u]));
  41. f[u][0] = f[u][1] = 0;
  42. for (int i = last[u]; i; i = g[i].next) {
  43. int v = g[i].to;
  44. if (v == fa) continue;
  45. dfs(v, u);
  46. for (int j = Min(K, siz[u]); j >= 0; j--)
  47. for (int k = 0; k <= Min(j, siz[v]); k++)
  48. if (f[u][j-k] >= 0) {
  49. long long val = 1ll*k*(K-k)*g[i].w + 1ll*(siz[v]-k)*(n-K+k-siz[v])*g[i].w;
  50. f[u][j] = Max(f[u][j], f[u][j-k] + f[v][k] + val);
  51. }
  52. }
  53. return ;
  54. }
  55. int main() {
  56. n = gi(), K = gi();
  57. for (int i = 1; i < n; i++)
  58. add(gi(), gi(), gi());
  59. init(1, 0);
  60. dfs(1, 0);
  61. printf("%lld\n", f[1][K]);
  62. return 0;
  63. }

洛谷 P3177 [HAOI2015]树上染色的更多相关文章

  1. 洛谷 P3177 [HAOI2015]树上染色 树形DP

    洛谷 P3177 [HAOI2015]树上染色 树形DP 题目描述 有一棵点数为 \(n\) 的树,树边有边权.给你一个在 \(0 \sim n\)之内的正整数 \(k\) ,你要在这棵树中选择 \( ...

  2. 洛谷P3177 [HAOI2015]树上染色(树形dp)

    题目描述 有一棵点数为 N 的树,树边有边权.给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 . 将所有点染色后,你会获得黑点两两之 ...

  3. 洛谷P3177 [HAOI2015]树上染色(树上背包)

    题意 题目链接 Sol 比较套路吧,设\(f[i][j]\)表示以\(i\)为根的子树中选了\(j\)个黑点对答案的贡献 然后考虑每条边的贡献,边的两边的答案都是可以算出来的 转移的时候背包一下. # ...

  4. BZOJ4033或洛谷3177 [HAOI2015]树上染色

    BZOJ原题链接 洛谷原题链接 很明显的树形\(DP\). 因为记录每个点的贡献很难,所以我们可以统计每条边的贡献. 对于每一条边,设边一侧的黑点有\(B_x\)个,白点有\(W_x\),另一侧黑点有 ...

  5. 洛谷 3177 [HAOI2015] 树上染色

    题目描述 有一棵点数为 N 的树,树边有边权.给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 . 将所有点染色后,你会获得黑点两两之 ...

  6. 洛谷P3178 [HAOI2015]树上操作(dfs序+线段树)

    P3178 [HAOI2015]树上操作 题目链接:https://www.luogu.org/problemnew/show/P3178 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边 ...

  7. 【洛谷】P3177 [HAOI2015]树上染色

    懒得复制题面了直接传送门吧 分析 直接求点与点之间的距离感觉不是很好求,所以我们考虑换一个求法. 瞄了一眼题解 距离跟路径上边的长度有关,所以我们直接来看每一条边的贡献吧(这谁想得到啊) 对于每一条边 ...

  8. Luogu P3177 [HAOI2015]树上染色

    一道有机结合了计数和贪心这一DP两大考点的神仙题,不得不说做法是很玄妙. 首先我们很容易想到DP,设\(f_{i,j}\)表示在以\(i\)为根节点的子树中选\(j\)个黑色节点的最大收益值. 然后我 ...

  9. P3177 [HAOI2015]树上染色

    题目描述 有一棵点数为 N 的树,树边有边权.给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 . 将所有点染色后,你会获得黑点两两之 ...

随机推荐

  1. 编程中&&和||的妙用

    &&符号在编程中表示“和”,也就是数学中的“且”! if(A && B){ } 上面的代表表示A==true并且B==true的情况下就执行花括号里面的代码. 值得注意 ...

  2. Docker 学习笔记_安装和使用MongoDB

    一.准备 1.宿主机OS:Win10 64 2.虚拟机OS:Ubuntu18.04 3.账号:docker 二.安装 1.搜索MongoDB镜像                            ...

  3. Flask解决跨域

    Flask解决跨域 问题:网页上(client)有一个ajax请求,Flask sever是直接返回 jsonify. 然后ajax就报错:No 'Access-Control-Allow-Origi ...

  4. SpringMVC——映射请求参数

    Spring MVC 通过分析处理方法的签名,将 HTTP 请求信息绑定到处理方法的相应人参中. @PathVariable @RequestParam @RequestHeader 等) Sprin ...

  5. IIS关闭Trace、OPTIONS方法

    方法(1):web.config 在<configuration>节点下添加如下代码: <system.webServer> <security> <requ ...

  6. ASP.NET Web Pages (Razor) FAQ

    ASP.NET Web Pages (Razor) FAQ By Tom FitzMacken|February 7, 2014 Print   This article lists some fre ...

  7. 通达OA整合教程

      资源下载地址: 通达OA 2015:http://pan.baidu.com/s/1qYMxsZU mysql下载:http://pan.baidu.com/s/1c2oVI5y 整合文件:htt ...

  8. Linux下为Eclipse安装hadoop插件

    前提条件:在Linux系统中已经安装好了jdk和hadoop 本文的安装环境:1.arch Linux 2. hadoop1.0.1本地伪分布模式安装  3. Eclipse 4.5 1. 下载Ecl ...

  9. java多线程的基本介绍

    Java多线程 1.进程与线程 进程是程序的一次动态执行过程,它需要经历从代码加载,代码执行到执行完毕的一个完整的过程,这个过程也是进程本身从产生,发展到最终消亡的过程.多进程操作系统能同时达运行多个 ...

  10. Extjs Hello extjs

    <html > <head runat="server"> <title></title> <link rel="s ...