2021.07.17 P3177 树上染色(树形DP)

[P3177 HAOI2015]树上染色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

重点:

1.dp思想是需要什么,维护什么。

2.通过具体的状态推出未知状态的解法。

题意:

一棵有n个点的树,将其中k个点染为黑色,其余点为白色,求任意一对白白两点之间的距离和与任意一对黑黑两点之间的距离。

分析:

dp思想是需要什么,维护什么。我们需要求距离和,我们就维护距离和。

在已经确定哪些点是黑点是,对于一条边,它对答案的贡献是端点u、v两端是

\[(u黑点个数*v黑点个数+u白点个数*v白点个数)*这条边的权值
\]

但我们还不知道哪些点是黑点,所以我们也要列出不同黑点个数,进行状态转移。

设ans[i] [j]为在以i为根的子树中,有j个点是黑点时的总贡献,依次枚举i可能的黑点个数、i的每一个子节点、以该子节点为根的子树可能的黑点的个数进行状态转移。具体分析在代码中。

代码如下:

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
#define int long long
const int N=2010;
int n,k,size[N],cnt,head[N],ans[N][N];
struct node{
int to,next,val;
}a[N*2];
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')w=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
void add(int u,int v,int w){
++cnt;
a[cnt].to=v;
a[cnt].val=w;
a[cnt].next=head[u];
head[u]=cnt;
}
void dfs(int x,int fa){
size[x]=1;
ans[x][0]=ans[x][1]=0;
for(int i=head[x];i;i=a[i].next){
int v=a[i].to;
if(v==fa)continue;
dfs(v,x);
size[x]+=size[v];
for(int j=min(k,size[x]);j>=0;j--){
if(ans[x][j]!=-1)
ans[x][j]+=ans[v][0]+size[v]*(n-k-size[v])*a[i].val;//当以x为根的子树中黑点个数为0时的贡献
for(int l=min(j,size[v]);l>0;l--){
if(ans[x][j-l]==-1)continue;//当这个子树中黑点个数为j-l这一状态还没开始计算时,果断跳过
ans[x][j]=max(ans[x][j],ans[x][j-l]+ans[v][l]+(l*(k-l)+(size[v]-l)*(n-k-size[v]+l))*a[i].val);//注意:计算的时候这条边会产生的贡献,以j为根节点的子树有l个黑点,所以这条边因为黑点产生的贡献为l*(k-l)*a[i].val,白点产生的贡献为(size[v]-l)*(n-k-size[v]+l)*a[i].val,而以x为根节点的子树此时有j-l个黑点,以v为根节点的子树有l个黑点
}
}
}
}
signed main(){
//freopen("1.in","r",stdin);
//freopen("1.out.txt","w",stdout);
n=read();k=read();
if(n-k<k)k=n-k;
for(int i=1;i<n;i++){
int u,v,w;
u=read();v=read();w=read();
add(u,v,w);
add(v,u,w);
}
memset(ans,-1,sizeof(ans));
dfs(1,0);
cout<<ans[1][k];
return 0;
}

2021.07.17 P3177 树上染色(树形DP)的更多相关文章

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

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

  2. 【BZOJ4033】[HAOI2015]树上染色 树形DP

    [BZOJ4033][HAOI2015]树上染色 Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染 ...

  3. bzoj 4033: [HAOI2015]树上染色 [树形DP]

    4033: [HAOI2015]树上染色 我写的可是\(O(n^2)\)的树形背包! 注意j倒着枚举,而k要正着枚举,因为k可能从0开始,会使用自己更新一次 #include <iostream ...

  4. 【HAOI2015】树上染色—树形dp

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

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

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

  6. 【BZOJ4033】【HAOI2015】树上染色 树形DP

    题目描述 给你一棵\(n\)个点的树,你要把其中\(k\)个点染成黑色,剩下\(n-k\)个点染成白色.要求黑点两两之间的距离加上白点两两之间距离的和最大.问你最大的和是多少. \(n\leq 200 ...

  7. bzoj4033 [HAOI2015]树上染色——树形DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4033 树形DP,状态中加入 x 与父亲之间的边的贡献: 边权竟然是long long... ...

  8. 【HAOI2015】树上染色 - 树形 DP

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

  9. BZOJ 4033 [HAOI2015]树上染色 ——树形DP

    可以去UOJ看出题人的题解. 这样的合并,每一个点对只在lca处被考虑到,复杂度$O(n^2)$ #include <map> #include <ctime> #includ ...

随机推荐

  1. 查看Linux系统、Apche、Nginx、 MySQL 、 PHP 版本

    1. 查看Linux版本: uname -a: more /etc/issue; cat /proc/version; 2. 查看Mysql版本: 在终端下执行 mysql -V #V必须大写 在he ...

  2. loj2341「WC2018」即时战略(随机化,LCT/动态点分治)

    loj2341「WC2018」即时战略(随机化,LCT/动态点分治) loj Luogu 题解时间 对于 $ datatype = 3 $ 的数据,explore操作次数只有 $ n+log n $ ...

  3. 【Mybatis】SQL语句的解析执行过程原理

    sqlSession简单介绍 拿到SqlSessionFactory对象后,会调用SqlSessionFactory的openSesison方法,这个方法会创建一个Sql执行器(Executor),这 ...

  4. XML常用解析API有哪几种?

    XML常用解析API有JAXP.JDOM.Dom4j等. JAXP是Java API for XML Processing的英文字头缩写,中文含义是:用于XML文档处理的使用Java语言编写的编程接口 ...

  5. 什么是原子操作?在 Java Concurrency API 中有哪些原 子类(atomic classes)?

    原子操作(atomic operation)意为"不可被中断的一个或一系列操作" . 处理器使用基于对缓存加锁或总线加锁的方式来实现多处理器之间的原子操作. 在 Java 中可以通 ...

  6. Spring框架的事务管理有哪些优点?

    它为不同的事务API  如 JTA,JDBC,Hibernate,JPA 和JDO,提供一个不变的编程模式. 它为编程式事务管理提供了一套简单的API而不是一些复杂的事务API如 它支持声明式事务管理 ...

  7. 怎样将 GB2312 编码的字符串转换为 ISO-8859-1 编码的 字符串?

    String s1 = "你好"; String s2 = new String(s1.getBytes("GB2312"), "ISO-8859-1 ...

  8. spring bean 容器的生命周期是什么样的?

    spring bean 容器的生命周期流程如下: 1.Spring 容器根据配置中的 bean 定义中实例化 bean. 2.Spring 使用依赖注入填充所有属性,如 bean 中所定义的配置. 3 ...

  9. 通过pink构造简易部署脚本

    安装git        https://www.cnblogs.com/youxiu326/p/10540753.html 安装maven https://www.cnblogs.com/youxi ...

  10. Netty之非阻塞处理

    Netty 是一个异步的.基于事件驱动的网络应用框架,用以快速开发高性能.高可靠性的网络 IO 程序. 一.异步模型 同步I/O : 需要进程去真正的去操作I/O: 异步I/O:内核在I/O操作完成后 ...