hdu1520 Anniversary party(树型dp)

来源:互联网 发布:外卖哪个软件便宜 编辑:程序博客网 时间:2024/05/16 17:54

hdu1520

题目

有一棵树,每个点有活跃值,告诉你树的结构,选点,有直接父子关系的不能选,求最大的活跃值。

思路

很套路的树型dp,不赘述。

代码

#include <iostream>#include <cstdlib>#include <cstdio>#include <vector>#include <cstring>using namespace std;vector<int> edges[6100];int happy[6100];int dp[6100][2];int vis[6100];int dfs(int root){    vis[root]=1;    dp[root][0]=happy[root];    dp[root][1]=0;    for(int i=0; i<edges[root].size(); i++)    {        int son=edges[root][i];        if(!vis[son]) dfs(son);        dp[root][0]+=dp[son][1];        dp[root][1]+=max(dp[son][1],dp[son][0]);    }    return max(dp[root][0],dp[root][1]);}int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        for(int i=1; i<=n; i++)        {            scanf("%d",&happy[i]);            edges[i].clear();        }        memset(vis,0,sizeof(vis));        int a,b;        while(scanf("%d %d",&a,&b))        {            if(a==0&&b==0) break;            edges[b].push_back(a);        }        int ans=-0x3f3f3f3f;        for(int i=1; i<=n; i++)        {            ans=max(ans,dfs(i));        }        printf("%d\n",ans);    }    return 0;}
0 0