2021.07.17 P3177 树上染色(树形DP)
2021.07.17 P3177 树上染色(树形DP)
[P3177 HAOI2015]树上染色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
重点:
1.dp思想是需要什么,维护什么。
2.通过具体的状态推出未知状态的解法。
题意:
一棵有n个点的树,将其中k个点染为黑色,其余点为白色,求任意一对白白两点之间的距离和与任意一对黑黑两点之间的距离。
分析:
dp思想是需要什么,维护什么。我们需要求距离和,我们就维护距离和。
在已经确定哪些点是黑点是,对于一条边,它对答案的贡献是端点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)的更多相关文章
- 洛谷 P3177 [HAOI2015]树上染色 树形DP
		
洛谷 P3177 [HAOI2015]树上染色 树形DP 题目描述 有一棵点数为 \(n\) 的树,树边有边权.给你一个在 \(0 \sim n\)之内的正整数 \(k\) ,你要在这棵树中选择 \( ...
 - 【BZOJ4033】[HAOI2015]树上染色 树形DP
		
[BZOJ4033][HAOI2015]树上染色 Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染 ...
 - bzoj 4033: [HAOI2015]树上染色 [树形DP]
		
4033: [HAOI2015]树上染色 我写的可是\(O(n^2)\)的树形背包! 注意j倒着枚举,而k要正着枚举,因为k可能从0开始,会使用自己更新一次 #include <iostream ...
 - 【HAOI2015】树上染色—树形dp
		
[HAOI2015]树上染色 [题目描述]有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白色.将所有点染色后,你会获得 ...
 - [BZOJ4033][HAOI2015]树上染色(树形DP)
		
4033: [HAOI2015]树上染色 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2437 Solved: 1034[Submit][Stat ...
 - 【BZOJ4033】【HAOI2015】树上染色 树形DP
		
题目描述 给你一棵\(n\)个点的树,你要把其中\(k\)个点染成黑色,剩下\(n-k\)个点染成白色.要求黑点两两之间的距离加上白点两两之间距离的和最大.问你最大的和是多少. \(n\leq 200 ...
 - bzoj4033 [HAOI2015]树上染色——树形DP
		
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4033 树形DP,状态中加入 x 与父亲之间的边的贡献: 边权竟然是long long... ...
 - 【HAOI2015】树上染色 - 树形 DP
		
题目描述 有一棵点数为 N 的树,树边有边权.给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 . 将所有点染色后,你会获得黑点两两之 ...
 - BZOJ 4033 [HAOI2015]树上染色 ——树形DP
		
可以去UOJ看出题人的题解. 这样的合并,每一个点对只在lca处被考虑到,复杂度$O(n^2)$ #include <map> #include <ctime> #includ ...
 
随机推荐
- 内置方法  __str__   __repr__
			
内置方法(双下方法,魔术方法) 在不需要程序员定义,本身就存在的类中的方法就是内置方法 内置方法: __名字__ __init__ 不需要我们主动调用,而是在实例化的时候内部自动调用的,存在一种 ...
 - 如何在 Java 中实现二叉搜索树
			
二叉搜索树 二叉搜索树结合了无序链表插入便捷和有序数组二分查找快速的特点,较为高效地实现了有序符号表.下图显示了二叉搜索树的结构特点(图片来自<算法第四版>): 可以看到每个父节点下都可以 ...
 - 「入门篇」初识JVM
			
记录于 2022-01-02 17:25:12 GhostFace 1. 什么是JVM? 概念 来自百度百科 JVM是 Java Virtual Machine(Java虚拟机)的缩写,JVM是一 ...
 - UNIX网络编程--学习日记
			
今天在学习accept函数的时候,在执行服务器程序的时候,碰到了如下的出错信息: bind error: Address already in use 其原因在于服务器程序使用了13号的端口; 然而在 ...
 - win10 doskey宏命令定义,类似于Linux的alias别名命令
			
doskey 命令别名=命令 例如:doskey echo2 = echo $1 这里的$1是占位符. 如果想删除,直接赋予空值即可:例如:doskey echo2= 总的来说把 https://do ...
 - Gradle Gretty进行runAppDebug的Listening for transport dt_socket at address: 5005 的后续配置
			
出现 Listening for transport dt_socket at address: 5005:代表debug端口已启动好了,接下来你需要进行配置远程Debug,进行附加Debug进程: ...
 - 数据库连接(Database link)?
			
在一个用户下,可以获取到另外的用户下的表的数据,通常在跨数据库时使用. create database link link93 connect to scott identified by tiger ...
 - 一个Spring的应用看起来象什么?
			
一个定义了一些功能的接口. 这实现包括属性,它的Setter , getter 方法和函数等. Spring AOP. Spring 的XML 配置文件. 使用以上功能的客户端程序.
 - lombok的使用。
			
今天学习spring event,无意中看到lombok插件,以前也见同事用过,特此看了下用法.觉得还挺好用,记录下. 网上找到的一个比较术语化的解释:lombok是一个基于LGPL的开源J2EE综合 ...
 - 攻防世界baby_web
			
baby_web 题目提示想想初始页,但我们一访问就会跳转到1.php我们使用bp抓包分析,我们发送到repeater模块修改请求访问1.php内容看看 发现flag隐藏了我们去hex中看看 这样我们 ...