题目链接:https://vjudge.net/problem/HDU-1520
InputEmployees are numbered from 1 to N. A first line of input contains a number N. 1 <= N <= 6 000. Each of the subsequent N lines contains the conviviality rating of the corresponding employee. Conviviality rating is an integer number in a range from -128 to 127. After that go T lines that describe a supervisor relation tree. Each line of the tree specification has the form: 
L K 
It means that the K-th employee is an immediate supervisor of the L-th employee. Input is ended with the line 
0 0OutputOutput should contain the maximal sum of guests‘ ratings. 
Sample Input
7 1 1 1 1 1 1 1 1 3 2 3 6 4 7 4 4 5 3 5 0 0
Sample Output
5
题意:在一个有根树上每个节点有一个权值,每相邻的父亲和孩子只能选择一个,
问怎么选择总权值之和最大。
思路:从根出发找,dp[i][0]表示节点i不选,dp[i][1]节点i选。
AC代码:
#include<stdio.h>
#include<vector> 
#include<string.h>
#include<algorithm>
using namespace std; 
const int maxn=6010;
vector<int>map[maxn];
int dp[maxn][2],a[maxn],N,vis[maxn];
void dfs(int u){
	 dp[u][0]=0;
	 dp[u][1]=a[u];
	for(int i=0;i<map[u].size();i++)
	{
		int v=map[u][i];
		dfs(v);
		dp[u][0]+=max(dp[v][0],dp[v][1]);
		dp[u][1]+=dp[v][0];
	}
}
int main(){
	while(~scanf("%d",&N)){
		for(int i=1;i<=N;i++) scanf("%d",&a[i]);
		for(int i=1;i<=N;i++) map[i].clear();
		memset(vis,0,sizeof(vis));
		int u,v;
		while(scanf("%d%d",&v,&u)&&u&&v)
		{
			map[u].push_back(v);
			vis[v]++;	
		}
		for(int i=1;i<=N;i++)
			if(!vis[i]){
				dfs(i);
				printf("%d\n",max(dp[i][0],dp[i][1]));
				break;
			}		
	}
	return 0;
}
HDU - 1520 Anniversary party (有向入门树形DP)
原文:https://www.cnblogs.com/djh0709/p/9606477.html