树形DP

树形DP

树形 DP,即在树上进行的 DP。由于树固有的递归性质,树形 DP 一般都是递归进行的。

例题

没有上司的舞会 洛谷1352

#include<bits/stdc++.h>
using namespace std;
int n,i,x,y,b[6005],f[6005][2];
vector<int>a[6005];
void sc(int x)
{
	for (int i=0;i<a[x].size();i++)
	{
		int to=a[x][i];
		sc(to);
		f[x][0]=f[x][0]+max(f[to][0],f[to][1]);
		f[x][1]=f[x][1]+f[to][0];
	}
}
int main()
{
	cin>>n;
	for (i=1;i<=n;i++)
		cin>>f[i][1];
	for (i=1;i<n;i++)
	{
		cin>>x>>y;
		a[y].push_back(x);
		b[x]=1;
	}
	for (i=1;i<=n;i++)
		if (!b[i])
			break;
	sc(i);
	cout<<max(f[i][0],f[i][1])<<'\n';
}
posted @ 2023-04-15 11:51  ShadowAA  阅读(13)  评论(0)    收藏  举报