poj 2342 anniversary party

题目大意:

n个人的关系为一棵树,有一个party,邀请了一个人,那么就不能邀请n的上级,求最多能邀请到多少人

思路:

树形dp

两个dp数组分别表示取n的时候的最大值和不取n的时候的最大值

如果取n,那么dp1[n]=它所有儿子的dp2之和

如果不取n,那么dp2[n]=它所有儿子的max(dp1,dp2)之和

最后输出根的max(dp1,dp2)

 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
using namespace std;
int ans,n,a[6020],dp[6020][2],x,t;
vector <int> vec[6020];
void dp1(int i)
{
    if(vec[i].size()==0) {dp[i][0]=a[i];dp[i][1]=0;return ;}
    for(int j=0;j<vec[i].size();j++)
    {
        dp1(vec[i][j]);
        dp[i][0]+=dp[vec[i][j]][1];
        dp[i][1]+=max(dp[vec[i][j]][1],dp[vec[i][j]][0]);
    }
    dp[i][0]+=a[i];
    ans=max(ans,max(dp[i][1],dp[i][0]));
    return ;
}
int main()
{
    scanf("%d",&n);
    int rt=0;
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    if(n==1) {printf("%d",a[n]);return 0;}
    while(scanf("%d%d",&x,&t)&&x!=0)
    {
        if(rt==0) rt=t;
        if(x==rt) rt=t;
        vec[t].push_back(x);
    }
    dp1(rt);
    printf("%d",ans);
}
View Code

 

posted @ 2017-07-23 13:02  jack_yyc  阅读(163)  评论(0编辑  收藏  举报