洛谷-P1352没有上司的舞会

基本思路

树形dp入门题,0表示不选中1表示选中。

\[\begin{array}{l} treedp[u][0]=max(treedp[u.boss][0],treedp[u.boss][1])\\ treedp[u][1]=treedp[u.boss][0]+arr[u]; \end{array} \]

#include<bits/stdc++.h>
using namespace std;
vector<int>boss[7000];
int arr[7000],brr[7000];
int treedp[7000][2];
int n;
void dfs(int u)
{
	treedp[u][1]=arr[u];
	treedp[u][0]=0;
	//for(int i=1;i<=n;i++)
	{
		for(int v:boss[u])
		{
			dfs(v);
			treedp[u][0]+=max(treedp[v][0],treedp[v][1]);
			treedp[u][1]+=treedp[v][0];
		}
	}
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>arr[i];
		
	}
	
	for(int i=1;i<=n-1;i++)
	{
		int l,r;
		cin>>l>>r;
		boss[r].push_back(l);
		brr[l]=1;
	}
	for(int i=1;i<=n;i++)
	{
		if(brr[i]==0)
		{
			//cout<<i<<endl;
			dfs(i);
			cout<<max(treedp[i][0],treedp[i][1])<<endl;
			break;
		}
	}
	
	return 0;
}
posted @ 2019-07-21 13:43  一块钱的争论  阅读(104)  评论(0编辑  收藏  举报