P1352 没有上司的舞会

树上DP入门题

dp[][0]表示不选他且以他为根的子树的最大快乐值

dp[][1]表示选他且以他为根的子树的最大快乐值

转移方程 .... 看代码吧

// luogu-judger-enable-o2
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

int base[6010],enter[6010];
int to[15000],nex[15000],head[15000];
int dp[6010][2];

void dfs(int u)
{
	dp[u][0]=0;
	dp[u][1]=base[u];
	for(int i=head[u];i;i=nex[i])
	{
		dfs(to[i]);
		dp[u][0]+=max(dp[to[i]][0],dp[to[i]][1]);
		dp[u][1]+=dp[to[i]][0];
	} 
}

int main()
{
	ios::sync_with_stdio(false);
	int n,l,k,s;
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>base[i];
	for(int i=1;i<n;i++)
	{
		cin>>l>>k;
		to[i]=l;
		nex[i]=head[k];
		head[k]=i;
		++enter[l];
	}
	for(int i=1;i<=n;i++)
		if(enter[i]==0)
		{
			s=i;
			break;
		}	
	dfs(s);
	cout<<max(dp[s][0],dp[s][1]);
	return 0;
} 
posted @ 2018-07-26 20:35  Coool  阅读(87)  评论(0编辑  收藏  举报