树型dp动态规划学习笔记(看一眼就懂了)

文章介绍了树的概念,包括层次性、递归性和N-1连通性,以及动态规划(dp)的阶段性、最优子结构性和无后效性。通过一个具体的例题P1352解释了如何在树结构中应用dp进行状态转移,提供了两种不同的代码实现方式,分别是自底向上的DFS和基于邻接表的处理。
摘要由CSDN通过智能技术生成

目录

涵义

转移

例题

样码


涵义

涵义由两个问题引出:

什么是树?

        1.层次性

        2.递归性

        3.N-1连通性(判断一个图是树的方法)

什么是dp?

        1.阶段性

        2.最优子结构性

        3.无后效性

转移

        层次—>阶段

        子树—>最优子结构·

        1.自底向上:类似于拓扑排序

        2.自上向下:递归实现(后序遍历)

例题

P1352 没有上司的舞会 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

这道题不难看出是树结构,用邻接表处理即可

如下:

 对于每个节点 i 状态描述:用1和0表示来与不来——f[i][1]和f[i][0]

转移方程如下:

f[i][0]=\sum max( f[i.son][0],f[i.son][1])

f[i][1]=\sum f[i.son][0]

这题选择自下而上dfs

样码

写法1——

#include<bits/stdc++.h>
using namespace std;
const int N=10000;
int n,happy[N],dp[N][2],head[N],cnt;
struct node
{
	int v;
	int nxt;
}tree[N*2];
void addedge(int u,int v)
{
	tree[++cnt]=node{v,head[u]};
	head[u]=cnt;
}
void dfs(int x,int fa)
{
	for(int i=head[x];i;i=tree[i].nxt)
	{
		int y=tree[i].v;
		if(y==fa) continue;//这一步一定要判,不然会死循环 
		dfs(y,x);
		dp[x][1]+=dp[y][0];
		dp[x][0]+=max(dp[y][1],dp[y][0]);
	}
	dp[x][1]+=happy[x];
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;++i)scanf("%d",&happy[i]);
	int l,k;
	for(int i=1;i<n;++i)
	{
		scanf("%d%d",&l,&k);
		addedge(l,k);
		addedge(k,l);
	}
	dfs(1,0);
	cout<<max(dp[1][1],dp[1][0]);
	return 0;
}

写法2——

#include<bits/stdc++.h>
using namespace std;
const int N=10000;
int n,happy[N],root,y[N],dp[N][2];
vector<int> son[N];
void dfs(int root)
{
	for(int i=0;i<root[son].size();i++)
	{
		int y=root[son][i];
		dfs(y);
		dp[root][1]+=dp[y][0];
		dp[root][0]+=max(dp[y][1],dp[y][0]);
	}
	dp[root][1]+=happy[root];
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;++i)cin>>happy[i];
	int l,k;
	for(int i=1;i<n;++i)
	{
		cin>>l>>k;
		y[l]=1;
		son[k].push_back(l);
	}
	for(int i=1;i<=n;++i)
		if(!y[i]) root=i;
	dfs(root);
	cout<<max(dp[root][1],dp[root][0]);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值