首页 > 其他分享 >Luogu P3177 树上染色 [ 蓝 ] [ 树形 dp ] [ 贡献思维 ]

Luogu P3177 树上染色 [ 蓝 ] [ 树形 dp ] [ 贡献思维 ]

时间:2024-07-26 23:28:35浏览次数:12  
标签:sz int Luogu ll P3177 树形 为根 dp

一道很好的树形 dp !!!!!

树上染色

错误思路

定义 \(dp[u][i]\) 表示以 \(u\) 为根的子树中,把 \(i\) 个点染成黑色的最大收益。

但这样写,就在转移的时候必须枚举每一个点,复杂度过大,而且还不好写,是十分错误的写法。

正确思路

一般看到有关树上“路径”的题,就要把路径拆成一个个独立的单边,对每个单边独立计算贡献。

我们尝试对某一条边 \((u,v)\) 进行考虑( \(u\) 为父亲,\(v\) 为儿子):
设儿子下面有 \(j\) 个黑点,整棵树有 \(k\) 个黑点,树上总共 \(n\) 个点 ,以 \(x\) 为根的子树的点数为 \(sz[x]\) 。
那么经过这条边的路径总数为:儿子下面和父亲上面的黑点的路径数 \((j*(k-j))\) 以及儿子下面和父亲上面的白点的路径数 \(((sz[v]-j)*(n-sz[v]-(k-j)))\) 的和。
然后乘上这条边的长度 \(w_i\) 。

\[(j*(k-j)+(sz[v]-j)*(n-sz[v]-(k-j)))*w_i \]

就是这条边的贡献。

于是 dp 状态就出来了:
定义 \(dp[u][i]\) 表示 以 \(u\) 为根的子树中,选 \(i\) 个点作为黑点,对答案整体的最大贡献
对于转移,我们只需要考虑 \(u\) 与 \(v\) 中的那条边,然后像树形背包一样转移就好了:

\[dp[u][i]=max(dp[u][i],dp[u][i-j]+dp[v][j]+(j*(k-j)+(sz[v]-j)*(n-sz[v]-(k-j)))*w_i) \]

细节处理

上界的处理(for(int i=min(k,sz[u]);i>=0;i--)for(int j=0;j<=min(i,sz[v]);j++))不必多说,这题的坑点在于下界:

考虑一条链的数据,对于一个点 \(u\) ,其子树的黑色点个数一定是 以 \(u\) 为根的树的黑色点个数 或者 比以 \(u\) 为根的树的黑色点个数少 \(1\) 。

所以如果我们不控制循环的下界,那么在链的 hack 下复杂度将直逼 \(O(n^3)\) 。

这是因为除去该子树,自己父节点下的其他子树的总结点数比 \(i-j\) 小,造成无效转移。

所以解一个不等式:

\[i-j \le sz[u]-sz[v] \]

解得

\[j \ge i-sz[u]+sz[v] \]

这就是 \(j\) 的下界。

时间复杂度 \(O(n^2)\) 。

树形背包检验自己复杂度正确与否,只需要构造一条链的数据,看看会不会被卡成立方的就好了。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,k,sz[2005];
struct edge{
	int to;
	ll w;
};
vector<edge>s[2005];
ll dp[2005][2005];
void dfs(int u,int fa)
{
	sz[u]=1;
	for(auto tmp:s[u])
	{
		int v=tmp.to;
		ll w=tmp.w;
		if(v==fa)continue;
		dfs(v,u);
		sz[u]+=sz[v];
		for(int i=min(k,sz[u]);i>=0;i--)
		{
			for(int j=max(0,i-sz[u]+sz[v]);j<=min(i,sz[v]);j++)
			{
				dp[u][i]=max(dp[u][i],dp[v][j]+dp[u][i-j]+(1ll*j*(k-j)+1ll*(sz[v]-j)*(n-k-(sz[v]-j)))*w);
			}
		}
	}
}
int main()
{
	cin>>n>>k;
	for(int i=1;i<=n-1;i++)
	{
		int u,v;
		ll w;
		cin>>u>>v>>w;
		s[u].push_back({v,w});
		s[v].push_back({u,w});
	}
	dfs(1,0);
	cout<<dp[1][k];
	return 0;
}

标签:sz,int,Luogu,ll,P3177,树形,为根,dp
From: https://www.cnblogs.com/zhr0102/p/18326459

相关文章

  • DP选讲做题记录 by 付乙淼
    DP选讲P5074EattheTrees最简单的插头DP,轮廓线和插头可以很轻松存储状态和转移。P4719【模板】"动态DP"&动态树分治P5024[NOIP2018提高组]保卫王国动态DP一般就是简单的DP带单点修改,而且给你放到树上,这样你就不得不写树剖,写树剖就需要维护重链,我们就要写出也就是......
  • 【Azure APIM】调用APIM的备份接口时候遇见InvalidParameters错误
    问题描述根据官方文档,可以调用RESTAPI来对APIM执行备份操作。要备份API管理服务,请发出以下HTTP请求:POSThttps://management.chinacloudapi.cn/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceN......
  • Android开发 - 存储辅助类 SharedPreferences 解析
    SharedPreferences简介SharedPreferences是Android平台上一个轻量级的存储辅助类,用来保存应用的一些常用配置。SharedPreferences的数据以键值对(key,val)的进行保存在以xml形式的文件中。在应用中通常做一些简单数据的持久化缓存从editor的put方法可以看出SharedPreferenc......
  • 可以捕捉高动态范围成像的的AR0521SR2C09SURA0-DP2、AR0522SRSM09SURA0-DP2、AR0821CS
    AR0521SR2C09SURA0-DP2、AR0522SRSM09SURA0-DP2、AR0821CSSC18SMEA0-DPBR图像传感器——明佳达1、AR0521SR2C09SURA0-DP2是一款1/2.5英寸CMOS数字图像传感器,带有2592(H)×1944(V)有效像素阵列。它能在线性或高动态范围模式下捕捉图像,且带有卷帘快门读取,其中包含了复杂......
  • 论文阅读:TKDP: Threefold Knowledge-Enriched Deep Prompt Tuning for Few-Shot Named
    将深度提示调优框架与三重知识(即TKDP)相结合,包括内部上下文知识和外部标签知识和语义知识。引言现有的少样本NER可分为3种:基于词-语义的方法、基于标签-语义的方法和基于提示的方法。基于词语义的方法完全依赖于输入词及其上下文。基于标签语义的方法需要额外利用标签知识。......
  • 【Android】数据存储方案——文件存储、SharedPreferences、SQLite数据库用法总结
    文章目录文件存储存储到文件读取文件SharedPreferences存储存储获取SharedPreferences对象Context类的getSharedPreferences()方法Activity类的getPreferences()方法PreferenceManager类中的getDefaultSharedPreferences()方法示例读取记住密码的功能SQLite......
  • 虚拟机编译安装 dpdk--运行helloworld
    DPDK技术介绍一,版本信息DPDK版本:dpdk-22.07操作系统:Ubuntu22.04.1LTS二、虚拟机ubuntu添加网卡1.2.显卡由enssx改为ethxsudonano/etc/default/grub找到GRUB_CMDLINE_LINUX=""改为GRUB_CMDLINE_LINUX="net.ifnames=0biosdevname=0"然后执行如下指令sudogr......
  • 插头DP
    插头DP前言今天学长讲了插头DP,以前觉得他的模板就是黑题,一定非常的难,但是学习了之后发现它其实挺好理解,但是难度该黑。鉴于水品有限,只简短的说一说,给自己梳理一下思路。算法我们从模板题的弱化版开始讲:P5074EattheTrees我们发现要是闭合回路,这只能老老实实状压,......
  • [lnsyoj538/luoguP3628/APIO2010]特别行动队
    题意原题链接给定序列\(a\)和自定义二次函数\(f(x)=ax^2+bx+c(a<0)\),要求将\(a\)分为几段(不妨设为\(k\)段),使得\(\sum_{i=1}^{k}f(\sum_{j=l_i}^{r_i}a_j)\)的值最大,求最大的值sol设计状态转移方程。显然,\(dp_i\)可以由\(dp_j\)转移当且仅当\(j<i\),这表示......
  • 从DDPM到DDIM(三) DDPM的训练与推理
    从DDPM到DDIM(三)DDPM的训练与推理前情回顾首先还是回顾一下之前讨论的成果。扩散模型的结构和各个概率模型的意义。下图展示了DDPM的双向马尔可夫模型。其中\(\mathbf{x}_T\)代表纯高斯噪声,\(\mathbf{x}_t,0<t<T\)代表中间的隐变量,\(\mathbf{x}_0\)代表生成的图像......