树形dp1

没有上司的舞会,树形dp

#include<bits/stdc++.h>
#define mms(a) memset(a,-1,sizeof(a)) 
using namespace std;

int dp[6010][2],fr[6010]; #dp[i][1]表示该节点参加舞会时,该子树的最大值
vector<int> v[6010];

int dfs(int next){
	for(int i=0;i<v[next].size();i++){
		dfs(v[next][i]);
		dp[next][0]+=max( dp[ v[next][i] ][1],dp[ v[next][i] ][0] );
		dp[next][1]+=dp[ v[next][i] ][0];
	}
	return 0;
}
int main(){
	int n,root;
	cin>>n;
	for(int i=1;i<=n;i++){
		dp[i][0]=0;
		scanf("%d",&dp[i][1]);
		v[i].clear();
		fr[i]=0;
	}
	int b,c;
	for(int i=1;i<n;i++){
		
		cin>>c>>b;
		v[b].push_back(c);
		fr[c]=1;
	}
	cin>>b>>c;
	for(int i=1;i<=n;i++){
		if(!fr[i]){
			root=i;
			break;
		}
	}
	dfs(root);
	cout<<max(dp[root][1],dp[root][0])<<endl;
	return 0;
}

  

原文地址:https://www.cnblogs.com/z-bear/p/11523268.html