嘟嘟嘟

首先这一眼看出来,要树形dp。
然后发现状态不好设,刚开始我想的是dp[i][j]表示以\(i\)为根的子树,选了\(j\)个黑点的最大价值。结果就不会转移了。
转移的时候想考虑\(<u, v, w>\)这一条边的贡献,但是发现这个状态的转移所涉及的不只是这一条边,还有子树中的边,于是就彻底gg了。
还是看了题解。
题解也是考虑贡献,而且也是考虑每一条边,但最大的区别是,我们枚举边,然后考虑边两侧的点对答案的贡献。
令dp[i][j]表示以\(i\)为根的子树,选了\(j\)个黑点,已经枚举到第\(x\)条边时,当前答案的最大值。
因为dfs的时候就相当于枚举边了,所以这一维自然省去。
于是对于黑点,有\(j * (K - j) * w(u, v)\)的贡献,
对于白点,有\((K - j) * (n - size[v] - (K - j)) * w(u, v)\)的贡献。
最后记得要初始化dp数组为-INF,因为有些状态不合法。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define In inline
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
const int maxn = 2e3 + 5;
inline ll read()
{ll ans = 0;char ch = getchar(), last = ' ';while(!isdigit(ch)) {last = ch; ch = getchar();}while(isdigit(ch)) {ans = (ans << 1) + (ans << 3) + ch - '0'; ch = getchar();}if(last == '-') ans = -ans;return ans;
}
inline void write(ll x)
{if(x < 0) x = -x, putchar('-');if(x >= 10) write(x / 10);putchar(x % 10 + '0');
}int n, K;
struct Edge
{int nxt, to; ll w;
}e[maxn << 1];
int head[maxn], ecnt = -1;
In void addEdge(int x, int y, ll w)
{e[++ecnt] = (Edge){head[x], y, w};head[x] = ecnt;
}int siz[maxn];
ll dp[maxn][maxn];
In void dfs(int now, int _f)
{siz[now] = 1; dp[now][0] = dp[now][1] = 0;for(int i = head[now], v; i != -1; i = e[i].nxt){if((v = e[i].to) == _f) continue;dfs(v, now);siz[now] += siz[v];for(int j = min(siz[now], K); j >= 0; --j)for(int k = 0; k <= min(j, siz[v]); ++k)dp[now][j] = max(dp[now][j], dp[now][j - k] + dp[v][k] + 1LL * k * (K - k) * e[i].w + 1LL * (siz[v] - k) * (n - siz[v] - K + k) * e[i].w);}
}int main()
{Mem(head, -1);n = read(); K = read();for(int i = 1; i < n; ++i){int x = read(), y = read(); ll w = read();addEdge(x, y, w); addEdge(y, x, w);}for(int i = 1; i <= n; ++i) fill(dp[i] + 1, dp[i] + K + 1, INF);//带劲的操作 dfs(1, 0);write(dp[1][K]), enter;return 0;
}

转载于:https://www.cnblogs.com/mrclr/p/10209710.html

[HAOI2015]树上染色相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 洛谷 P3177 [HAOI2015]树上染色

    题目链接 题目描述 有一棵点数为 \(N\) 的树,树边有边权.给你一个在 \(0~ N\) 之内的正整数 \(K\) ,你要在这棵树中选择 \(K\)个点,将其染成黑色,并将其他 的\(N-K\)个 ...

  7. [HAOI2015]树上染色(树形dp,树形背包)

    链接:https://ac.nowcoder.com/acm/problem/19996 来源:牛客网 题目描述 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个 ...

  8. [HAOI2015]树上染色(树形背包)

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

  9. bzoj4033:[HAOI2015]树上染色

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

  10. bzoj4033 [HAOI2015]树上染色

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

最新文章

  1. MIT重磅报告:一文看清AI商业化现状与未来
  2. 写一下这两天的生活吧!开学了,也没有多少时间了
  3. JZOJ__Day 6:【普及模拟】Oliver的成绩(score)
  4. c++并发编程实战_Java 并发编程实战:JAVA中断线程几种基本方法
  5. java中compare语句的用法_Java RuleBasedCollator compare()用法及代码示例
  6. 使用栈解决的一类经典问题:表达式转换及求值;中缀表达式;前缀表达式,后缀表达式,中缀转前缀;中缀转后缀;后缀表达式求值;波兰式,逆波兰式
  7. 四川专科学校排名四川计算机,四川省现代计算机职业学院2020年排名
  8. h5文字垂直居中_基于两款开源 h5 媒体编辑器定制一套海报系统
  9. 内核如何为各种系统调用服务
  10. struts2 返回html文本,Struts2 s:textfield文本示例
  11. shell基础之编译安装nginx
  12. 生成验证码封装(新版)
  13. visio 2020 最新版安装过程及注意事项
  14. 金仓数据库KingbaseES之WITH ORDINALITY
  15. representation learning的理解
  16. 26两种主界面的设计
  17. 从零开始学前端 - 16. JS对象Object介绍及常用方法
  18. 机械臂示教轨迹参数化方法 DMP, Dynamic Movement Primitive (一)
  19. ubuntu ibus输入法 卡顿
  20. KnockoutJs 进阶学习

热门文章

  1. python函数的特性_Python学习(007)-函数的特性
  2. 笨方法学python3 mobi_[下载]Learn Python 3 the Hard Way(已更新完整版PDF\AZW3\EPUB\MOBI)...
  3. 核fisher matlab,使用Fisher法matlab结合P值?
  4. Python遍历破解FTP密码,并上传webshell
  5. 如果打开MSSQL server 显示无项目的解决方法
  6. Spring 系统学习:Spring的事务管理---事务回顾
  7. ORACLE数据库常见问题诊断方法 ---(常见错误篇)
  8. 问题 C: 编写函数:比较字符串 之一 (Append Code)
  9. python判断最小公倍数
  10. linux lddbus设备,Linux设备驱动程序学习(14)-Linux设备模型(各环节的整合)