当前位置: 首页 > article >正文

[HAOI2015] 树上染色(树形 DP)

题目传送门icon-default.png?t=O83Ahttps://www.luogu.com.cn/problem/P3177

解题思路

设 f(i,j) 表示以 i 为根的子树染 j 个黑点的最大收益值。

设一共有 n 个节点,要染 m 个点。

完成 DP 状态的设计后,开始推导转移方程……

对于一个点 x,它下面有一条通向 to,权值为 w 的边。

我们枚举 j,表示以 x 为根的子树已经染了 j 个点;

然后在枚举 k 表示以 to 为子树要染 k 个点;

然后,这条边的贡献会是多少呢?

首先,如果 to 为根的子树有 k 个被染的点,那么是不是 to 以外应该会有 m-k 个点,然后两边的点两两组合,得到的贡献是 k \times (m-k) \times w

然后,如果 to 为根的子树有 k 个被染的点,那么是不是 to 为根的子树就会有 size[to]-k 个白点?对于 to 以外,应该会有 (n-m-(size[to-k])) 个白点。同理,两两组合,贡献是:(size[to]-k) \times (n-m-(size[to-k])) \times w

(其中 size[to] 表示 to 为根的子树的大小)。

于是,我们可以从 1 号点开始 dfs,同时进行 DP。

代码

记得开 long long!

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
vector<pair<int,int> > g[2001];
int size[2001];
int f[2001][2001];

void dfs(int x,int fa)
{
	size[x]=1;
	for(auto y:g[x])
	{
		int to=y.first;
		int w=y.second;
		if(to==fa)continue;
		
		dfs(to,x);
		
		for(int j=min(m,size[x]);j>=0;j--)
		{
			for(int k=min(m,size[to]);k>=0;k--)
			{
				if(j+k<=m)
				{
					int temp;
					temp=k*(m-k)*w+(size[to]-k)*(n-m-(size[to]-k))*w;
					f[x][j+k]=max(f[x][j+k],f[x][j]+f[to][k]+temp);
				}
			}
		}
		
		size[x]+=size[to];
	}
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	cin>>n>>m;
	
	int u,v,w;
	for(int i=1;i<=n-1;i++)
	{
		cin>>u>>v>>w;
		g[u].push_back(make_pair(v,w));
		g[v].push_back(make_pair(u,w));
	}
	
	dfs(1,0);
	
	cout<<f[1][m];
	return 0;
}


http://www.kler.cn/a/392559.html

相关文章:

  • 提取神经网络数学表达式
  • JFROG相关API
  • 数据库SQL——连接表达式(JOIN)图解
  • 微擎框架php7.4使用phpexcel导出数据报错修复
  • 深入理解接口测试:实用指南与最佳实践5.0(三)
  • 事件循环 -- 资源总结(浏览器进程模型、事件循环机制、练习题)
  • 项目技术栈-解决方案-消息队列
  • T507 buildroot linux4.9之AP6275S wifi/bt 以太网开发调试
  • 小白docker入门简介
  • day60 图论章节刷题Part10(Floyd 算法、A * 算法)
  • linq语句在CAD c# 二次开发中的应用——快速筛选curve中polyline
  • 【C++】C++11特性(上)
  • docker执行java的jar包
  • 机器学习引领流体动力学新纪元:CFD、Fluent与OpenFOAM的深度融合
  • ‌STM32的USART2_RX引脚可以外接5V电压
  • 前端js用canvas合成图片并转file对象
  • WebRTC视频 03 - 视频采集类 VideoCaptureDS 上篇
  • openresty入门教程:rewrite_by_lua_block
  • Linux应用——线程池
  • Spring Boot框架:电商解决方案的构建
  • 2.操作系统常见面试问题2
  • MySQL数据库常用命令大全(完整版——表格形式)
  • 「漏洞复现」某赛通电子文档安全管理系统 HookService SQL注入漏洞复现(CVE-2024-10660)
  • C++(Qt)软件调试---符号转换工具cv2pdb (24)
  • 【c++丨STL】list的使用
  • 【目标检测】【Ultralytics-YOLO系列】Windows11下YOLOV5人脸目标检测