20251116 树状DP总结

引子

树形DP是一种基于树结构的动态规划算法,利用树的递归特性进行状态转移。根据兄弟节点间的约束关系,可分为两种类型:

  1. 无相互约束型:兄弟节点的决策互不影响
  2. 有相互约束型:兄弟节点的决策相互制约

P3155 CQOI2009 叶子的染色

1.状态
dp[i][0/1]表示以i为根的子树且点i染色为0或1,且子树内叶子合法的最少染色数。

2.答案
min(dp[m][0],dp[m][1])

3.转移

考虑cur->nxt父子关系

cpp 复制代码
dfs(nxt,cur);
dp[cur][0]+=min(dp[nxt][0]-1,dp[nxt][1]);

4.code实现

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int m,n,c[5025],dp[10005][2];
vector<int> E[10005];
void dfs(int x,int fa){
	dp[x][0]=dp[x][1]=1;
	if(x<=n){
		dp[x][1-c[x]]=1e9;
	}
	for(int i=0;i<E[x].size();i++){
		int v=E[x][i];
		if(v==fa)continue;
		dfs(v,x);
		dp[x][0]+=min(dp[v][0]-1,dp[v][1]);
		dp[x][1]+=min(dp[v][1]-1,dp[v][0]);
	}
}
int main(){
	cin>>m>>n;
	for(int i=1;i<=n;i++){
		cin>>c[i];
	}
	for(int i=1;i<m;i++){
		int u,v;
		cin>>u>>v;
		E[u].push_back(v);
		E[v].push_back(u);
	}
	dfs(m,0);
	cout<<min(dp[m][0],dp[m][1]);
	return 0;
}
相关推荐
波尔德几秒前
Origin 2024 绘制钟形正态分布曲线:填充颜色并导出透明 PNG
人工智能·算法
Omics Pro11 分钟前
微软:多模态生物世界模型
数据库·人工智能·算法·microsoft·机器学习·自然语言处理
hai31524754317 分钟前
语言学集合定律
人工智能·算法
小溪学编程21 分钟前
C语言篇:语言结构
c语言·开发语言·算法
Ivanqhz42 分钟前
KV Cache
服务器·数据库·人工智能·深度学习·算法
H.莓飛44 分钟前
【数据结构】二叉树
linux·数据结构·算法
Omics Pro1 小时前
~30,000+引用!理论2005,R包2008,多组学集成AI增强
开发语言·数据库·人工智能·算法·机器学习·自然语言处理·r语言
梦帮科技1 小时前
【3.0修订版】创世与节点工程:genesis.json 与 node.toml 解剖
数据结构·算法·json·去中心化·区块链·智能合约·信任链
影视飓风TIM1 小时前
Linux 进程虚拟地址空间详解
linux·算法
如何原谅奋力过但无声1 小时前
【灵神高频面试题合集21-25】动态规划(下)
算法·动态规划