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;
}
相关推荐
SmartBrain1 分钟前
OCR 模型在医疗场景的选型研究
人工智能·算法·语言模型·架构·aigc·ocr
梵刹古音2 分钟前
【C语言】 跳转语句
c语言·开发语言·算法
liu****13 分钟前
29.路径类dp
c++·算法·acm
JMchen12314 分钟前
Android计算摄影实战:多帧合成、HDR+与夜景算法深度剖析
android·经验分享·数码相机·算法·移动开发·android-studio
阿猿收手吧!19 分钟前
【C++】C++模板特化:精准定制泛型逻辑
开发语言·c++·算法
智驱力人工智能33 分钟前
货车走快车道检测 高速公路安全治理的工程实践与价值闭环 高速公路货车占用小客车道抓拍系统 城市快速路货车违规占道AI识别
人工智能·opencv·算法·安全·yolo·目标检测·边缘计算
喵手43 分钟前
Python爬虫实战:电商实体消歧完整实战 - 从混乱店铺名到标准化知识库的工程化实现,一文带你搞定!
爬虫·python·算法·爬虫实战·零基础python爬虫教学·同名实体消除·从混乱店铺名到标准化知识库
weixin_452159551 小时前
C++与Java性能对比
开发语言·c++·算法
80530单词突击赢1 小时前
C++哈希表实现:开散列与闭散列详解
算法·哈希算法·散列表
Timmylyx05181 小时前
类欧几里得学习笔记
笔记·学习·算法