BZOJ4033 [HAOI2015]T1
令$f[p][i]$表示以$p$为根的子树内,选了$i$个黑点,剩下的都是白点的这个子树内贡献的答案
如果$p$的子树都算出来了,只要计算$p$与$fa[p]$之间的边对答案的贡献就好了,贡献是$dis * (i * (sz - i) + (k - i) * (n - k - (sz - i)))$
于是树形动规一下就好了
/**************************************************************
Problem: 4033
User: rausen
Language: C++
Result: Accepted
Time:308 ms
Memory:32300 kb
****************************************************************/ #include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
typedef long long ll; const int N = 2e3 + ; struct edge {
int next, to, v;
edge(int _n = , int _t = , int _v = ) : next(_n), to(_t), v(_v) {}
} e[N << ]; int n, k;
int first[N], tot;
int sz[N];
ll f[N][N], tmp[N]; inline void Add_Edges(int x, int y, int z) {
e[++tot] = edge(first[x], y, z), first[x] = tot;
e[++tot] = edge(first[y], x, z), first[y] = tot;
} inline ll calc(int x, int y) {
return 1ll * y * (x - y);
} #define y e[x].to
inline void dfs(int p, int fa, int w) {
int x, i, j;
sz[p] = ;
for (x = first[p]; x; x = e[x].next)
if (y != fa) {
dfs(y, p, e[x].v);
memcpy(tmp, f[p], sizeof(tmp));
for (i = min(sz[p], k); ~i; --i)
for (j = min(sz[y], k - i); ~j; --j)
tmp[i + j] = max(tmp[i + j], f[p][i] + f[y][j]);
memcpy(f[p], tmp, sizeof(tmp));
sz[p] += sz[y];
}
for (i = min(sz[p], k); ~i; --i)
f[p][i] += (calc(k, i) + calc(n - k, sz[p] - i)) * w;
}
#undef y int main() {
int i, x, y, z;
scanf("%d%d", &n, &k);
for (i = ; i < n; ++i) {
scanf("%d%d%d", &x, &y, &z);
Add_Edges(x, y, z);
}
dfs(, , );
printf("%lld\n", f[][k]);
return ;
}
BZOJ4033 [HAOI2015]T1的更多相关文章
- BZOJ4033 HAOI2015 树上染色 【树上背包】
BZOJ4033 HAOI2015 树上染色 Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白 ...
- [bzoj4033][HAOI2015]树上染色_树形dp
树上染色 bzoj-4033 HAOI-2015 题目大意:给定一棵n个点的树,让你在其中选出k个作为黑点,其余的是白点,收益为任意两个同色点之间距离的和.求最大收益. 注释:$1\le n\le 2 ...
- [BZOJ4033][HAOI2015]树上染色(树形DP)
4033: [HAOI2015]树上染色 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2437 Solved: 1034[Submit][Stat ...
- 【题解】 bzoj4033: [HAOI2015]树上染色* (动态规划)
bzoj4033,懒得复制,戳我戳我 Solution: 定义状态\(dp[i][j]\)表示\(i\)号节点为根节点的子树里面有\(j\)个黑色节点时最大的贡献值 然后我们要知道的就是子节点到根节点 ...
- BZOJ4033: [HAOI2015]树上染色(树形DP)
4033: [HAOI2015]树上染色 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3461 Solved: 1473[Submit][Stat ...
- 洛谷P3177||bzoj4033 [HAOI2015]树上染色
洛谷P3177 bzoj4033 根本不会做... 上网查了题解,发现只要在状态定义的时候就考虑每一条边全局的贡献就好了? 考虑边的贡献和修改状态定义我都想到了,然而并不能想到要结合起来 ans[i] ...
- [BZOJ 4033] [HAOI2015] T1 【树形DP】
题目链接:BZOJ - 4033 题目分析 使用树形DP,用 f[i][j] 表示在以 i 为根的子树,有 j 个黑点的最大权值. 这个权值指的是,这个子树内部的点对间距离的贡献,以及 i 和 Fat ...
- BZOJ4033 [HAOI2015]树上染色
本来是考虑, $ f[x][i][0/1] $ 表示 $ x $ 子树中有$i$个黑点,且 $ x $ 是白点/黑点.但是这里的答案是要统计不同的子树的贡献的.所以就gg了. 看了题解. 应该是要设$ ...
- BZOJ4033 [HAOI2015]树上染色 【树形dp】
题目 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 将其他的N-K个点染成白色.将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间 ...
随机推荐
- Java——FIle:
1.读取文件夹中的文件 /** * 读取图片文件 * @param imgPath 文件所在的文件夹绝对路径 * @return * @throws FileNotFoundException */ ...
- 杭电HDU1042(有点坑的高精度)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1042 题意: Given an integer N(0 ≤ N ≤ 10000), your task i ...
- DOM 操作XML(CRUD)
<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架> ...
- [poj2286]The Rotation Game (IDA*)
//第一次在新博客里发文章好紧张怎么办 //MD巨神早已在一个小时前做完了 The Rotation Game Time Limit: 15000MS Memory Limit: 150000K To ...
- 让你分分钟读懂CPU架构及芯片厂商
CPU架构是CPU厂商给属于同一系列的CPU产品定的一个规范,主要目的是为了区分 不同类型CPU的重要标示.目前市面上的CPU指令集分类主要分有两大阵营,一个是intel.AMD为首的复杂指令集CPU ...
- 【Todo】Nginx架构学习
要进行Web服务,绕不开的就是Nginx.这已经是大型网站的标配.对Nginx进行一定程度的深入学习. http://www.ituring.com.cn/article/4436 http://bl ...
- HTML的<body>标签详解与HTML常用的控制标记
一.<body>标签: 用于标记网页的主体,body 元素包含文档的所有内容(比如文本.超链接.图像.表格和列表等等.) 1.body标签中可用的属性: bgcolor="颜色值 ...
- eclipse如何调试(Debug)程序(zhuan)
http://jingyan.baidu.com/article/e6c8503c7e46b6e54f1a18c5.html ************************************* ...
- 使用命令参数方式指定log4j配置文件
http://blog.csdn.net/changong28/article/details/39717209 ******************************************* ...
- HEVC编解码优化信息
hevc解码GPU优化: 1.This GPU acceleration has opened up the possibility of playing a Full-HD (1080p) at 6 ...