题目

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

输入格式

第一行两个整数N,K。
接下来N-1行每行三个正整数fr,to,dis,表示该树中存在一条长度为dis的边(fr,to)。
输入保证所有点之间是联通的。
N<=2000,0<=K<=N

输出格式

输出一个正整数,表示收益的最大值。

输入样例

5 2

1 2 3

1 5 1

2 3 1

2 4 2

输出样例

17

提示

【样例解释】

将点1,2染黑就能获得最大收益。

题解

我dp真是太弱了
很自然地可以想到设一个dp状态\(f[i][j]\),表示\(i\)为根的子树中选\(j\)个黑点的最大收益
这个时候会不会有些奇怪?这个收益具体指什么?
由题目可知,我们得到的收益必须是成对点贡献出来的,每个区域不能作为独立的个体产生贡献

我们考虑把点与点间的贡献转移到边上
对于一条边\((u,v)\),我们记\(u\)一侧的黑点数为\(b_u\),白点数为\(w_u\),\(v\)一侧类似
那么该边的贡献就为
\[w_{(u,v)} * (b_u * b_v + w_u * w_v)\]

那么我们改变一下:\(f[i][j]\)表示\(i\)为根的子树中选\(j\)个黑点,此时子树中的边产生的最大贡献
那么就很好转移了
对于节点\(i\),其子树的贡献已经算出,我们只需要考虑其到子树的边的贡献即可
我们枚举其儿子\(t\),并枚举儿子选的黑点数,再枚举剩余的子树的黑点数计入贡献

乍一看似乎\(O(n^3)\)
仔细分析一下,我们枚举的是子树的大小,每个子树产生的复杂度为\(O(siz[t] * (siz[u] - siz[t]))\),就相当于该子树的点与剩余子树的点形成的点对的个数
也就是说,我们实质在枚举点对,而且容易发现,每对点对只会在其\(lca\)处被枚举
所以可以保证是\(O(n^2)\)的

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define LL long long int
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<' '; puts("");
using namespace std;
const int maxn = 2005,maxm = 10005,INF = 1000000000;
inline LL read(){LL out = 0,flag = 1; char c = getchar();while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}return out * flag;
}
int h[maxn],ne = 2;
struct EDGE{int to,nxt; LL w;}ed[maxm];
inline void build(int u,int v,LL w){ed[ne] = (EDGE){v,h[u],w}; h[u] = ne++;ed[ne] = (EDGE){u,h[v],w}; h[v] = ne++;
}
LL f[maxn][maxn],t[maxn];
int siz[maxn],fa[maxn],n,K;
inline void cmax(LL& a,LL b){if (a < b) a = b;}
void dfs(int u){siz[u] = 1;for (int i = 2; i <= n + 1; i++) f[u][i] = -INF;Redge(u) if ((to = ed[k].to) != fa[u]){fa[to] = u;dfs(to);for (int i = 0; i <= siz[u] + siz[to]; i++) t[i] = -INF;for (int i = 0; i <= siz[u]; i++)for (int j = 0; j <= siz[to]; j++)cmax(t[i + j],f[u][i] + f[to][j] + ed[k].w * (j * (K - j) + (siz[to]  - j) * (n - K - (siz[to] - j))));siz[u] += siz[to];for (int i = 0; i <= siz[u]; i++)f[u][i] = t[i];}
}
int main(){n = read(); K = read();int a,b; LL w;for (int i = 1; i < n; i++){a = read(); b = read(); w = read();build(a,b,w);}dfs(1);printf("%lld\n",f[1][K]);return 0;
}

转载于:https://www.cnblogs.com/Mychael/p/8886292.html

BZOJ4033 [HAOI2015]树上染色 【树形dp】相关推荐

  1. [BZOJ4033][HAOI2015]树上染色(树形DP)

    4033: [HAOI2015]树上染色 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 2437  Solved: 1034 [Submit][St ...

  2. bzoj4033: [HAOI2015]树上染色(树形dp)

    4033: [HAOI2015]树上染色 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 3269  Solved: 1413 [Submit][St ...

  3. [BZOJ4033][HAOI2015]树上染色

    4033: [HAOI2015]树上染色 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 2108  Solved: 901 [Submit][Sta ...

  4. bzoj4033 [HAOI2015]树上染色

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4033 重要的思路:与其考虑每一个点对的贡献,不如考虑每条边的贡献(==被经过了几次)! 树形 ...

  5. bzoj4033:[HAOI2015]树上染色

    传送门 我一开始想的是考虑每个点的颜色 设的状态就是\(f[i][j]\)表示\(i\)子树里有\(j\)个黑点的\(i\)子树的收益最大值,后来发现无法转移 那么考虑答案的统计,可以对于边统计答案 ...

  6. bzoj 4033: [HAOI2015]树上染色(树形DP)

    4033: [HAOI2015]树上染色 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 1786  Solved: 754 [Submit][Sta ...

  7. Luogu P3177 [HAOI2015] 树上染色(树上背包)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Luogu P3177 [HAOI2015] 树上染色 有一棵点数为 NNN 的树,树边有边权.给你一 ...

  8. 『树上匹配 树形dp』

    树上匹配 Description 懒惰的温温今天上班也在偷懒.盯着窗外发呆的温温发现,透过窗户正巧能看到一棵 n 个节点的树.一棵 n 个节点的树包含 n-1 条边,且 n 个节点是联通的.树上两点之 ...

  9. 【bzoj1304】[CQOI2009]叶子的染色 树形dp

    题目描述 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白色.你的着色方案应该保证根结点到每个叶子的简单路径上都至少包含一个有色结点( ...

  10. 【牛客每日一题】4.15 Treepath 题解(树上dfs/树形DP)

    题目链接:https://ac.nowcoder.com/acm/problem/14248 来源:牛客网 题目描述 给定一棵n个点的树,问其中有多少条长度为偶数的路径.路径的长度为经过的边的条数.x ...

最新文章

  1. ffmpeg php 快速播放,怎么在PHP中利用FFmpeg函数对视频播放的时长进行获取
  2. LINUX内核经典面试题30道及解答
  3. linux shell 逻辑判断 [] [[]] -n -z 用法区别
  4. java环境安装之不能安装exe文件
  5. Java 第二章 程序设计基础
  6. 17行代码AC——L1-030 一帮一 (15分)(解题报告)
  7. 【Transformer】AdaViT: Adaptive Tokens for Efficient Vision Transformer
  8. 大数据2019年的三大趋势你看了吗?
  9. Unity中所有特殊的文件夹
  10. 博客园上海地区活动——LinkCoder主题社区第二期:淘宝服务化架构的设计和实践...
  11. 近6年被引用次数最多的深度学习论文top100(附下载地址)
  12. zsh fg: no job control in this shell.
  13. TL-WAR308 刷openwrt以及魔改8M固件到16M
  14. 视频点播服务器项目,项目九搭建视频点播vod服务器美萍vod.doc
  15. 移动必选套餐短信办理代码
  16. python 7-1 输出星期名缩写 (10分)
  17. 中国未来经济发展方向,共享经济大势所趋
  18. 深入理解Apache虚拟主机
  19. depot_tools更新失败
  20. 台达plc接线图实物_西门子plc接线图实物图

热门文章

  1. Cefsharp入坑实操
  2. 0627-TP整理三(对表的操作,数据的显示)
  3. 聚类算法之划分方法(k-means)
  4. 用 JavaScript 实现内存位翻转漏洞
  5. CentOS yum 一次性安装所需要的依赖库。
  6. 开启关闭Centos的自动更新
  7. EPC(建筑工程总承包)行业解决方案(汉得咨询)
  8. 【代码优化】考虑使用静态工厂方法代替构造器
  9. 挑战性题目DSCT601:背包问题
  10. pod镜像拉取策略、重启容器策略