题目意思:有n个人,他们的关系是一棵树,每个人有一个欢乐度,举行一个聚会,邀请个人里的一些人,但是如果两个人的关系是上下级,他们最多一个被邀请
int dp[][2] dp[][0]表示不邀请这个人得到的最大欢乐度,dp[][1]表示邀请这个人得到的最大欢乐度
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<set> 6 #include<vector> 7 #include<map> 8 #include<algorithm> 9 #include<cmath> 10 #include<stdlib.h> 11 using namespace std; 12 int dp[6200][2]; 13 vector<int >ko[6200]; 14 int n,pe[6200],fa[6200],ben,vit[6200][2]; 15 int dfs(int pos,int way) 16 { 17 if(ko[pos].size()==0) 18 { 19 if(way) 20 dp[pos][way]=pe[pos]; 21 else 22 dp[pos][way]=0; 23 return dp[pos][way]; 24 } 25 if(vit[pos][way]) 26 return dp[pos][way]; 27 if(way) 28 dp[pos][way]+=pe[pos]; 29 for(int i=0;i<ko[pos].size();i++) 30 { 31 int to=ko[pos][i]; 32 if(way==0) 33 { 34 dp[to][0]=dfs(to,0); 35 dp[to][1]=dfs(to,1); 36 vit[to][0]=vit[to][1]=vit[pos][0]=1; 37 dp[pos][0]+=max(dp[to][0],dp[to][1]); 38 } 39 else 40 { 41 dp[to][0]=dfs(to,0);; 42 vit[to][0]=vit[pos][1]=1; 43 dp[pos][1]+=dp[to][0]; 44 } 45 } 46 return dp[pos][way]; 47 } 48 void solve() 49 { 50 memset(dp,0,sizeof(dp)); 51 memset(vit,0,sizeof(vit)); 52 dp[ben][0]=dfs(ben,0); 53 dp[ben][1]=dfs(ben,1); 54 cout<<max(dp[ben][0],dp[ben][1])<<endl; 55 } 56 int main() 57 { 58 while(cin>>n) 59 { 60 for(int i=1;i<=n;i++) 61 scanf("%d",&pe[i]); 62 for(int i=1;i<=n;i++) 63 ko[i].clear(); 64 int a,b; 65 memset(fa,-1,sizeof(fa)); 66 while(scanf("%d%d",&a,&b)&&(a+b)!=0){ 67 ko[b].push_back(a); 68 fa[a]=b; 69 } 70 for(int i=1;i<=n;i++) 71 if(fa[i]==-1) 72 ben=i; 73 solve(); 74 } 75 }