Input Employees 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 0
Output Output 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题意:n个人去参加聚会,其中有直接上下级关系的参加聚会会影响气氛,所以不能参加,每个人参加聚会都会有一个活跃度,现在要你计算从n个人中选择出一些人,使得本次聚会的活跃度最大
思路:很简单,每个人参加和不参加都会有不同的结果,他参加,那么只需要加上他的下属不参加的权值,他不参加,那么加上他下属参加或不参加中的最大值,最后只需要计算出最高上司参加或者不参加的最大值就可以了
PS:树形DP的代码你们去参考其他人的吧,最近在训练蓝桥杯,所以强化DFS能力
AC代码:
#include#define N 6005 struct p { int fm; int child; int brother; int att; int no; void init() { no=0; fm=0; brother=0; child=0; } int Max() { return att>no? att:no; } }num[N]; void dfs(int x) { int child=num[x].child; while(child) { dfs(child); num[x].att+=num[child].no; num[x].no+=num[child].Max(); child=num[child].brother; } } int main() { int n; while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) { num[i].init(); scanf("%d",&num[i].att); } int a,b; while(scanf("%d %d",&a,&b),a||b) { num[a].fm=b; num[a].brother=num[b].child; num[b].child=a; } for(int i=1;i<=n;i++) { if(num[i].fm==0) { dfs(i); printf("%d\n",num[i].Max()); break; } } } return 0; }