hdu 1520(简单树形dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520

思路:dp[u][0]表示不取u的最大价值,dp[u][1]表示取u的最大价值,于是有dp[u][0]+=max(dp[v][0],dp[v][1]),dp[u][1]+=dp[v][0](其中v是u的孩子)。

 1 #include<iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<vector>

 6 using namespace std;

 7 #define MAXN 6060

 8 

 9 int dp[MAXN][2];

10 int n,ans;

11 vector<vector<int> >G;

12 

13 void dfs(int u,int father)

14 {

15     for(int i=0;i<G[u].size();i++){

16         int v=G[u][i];

17         if(v==father)continue;

18         dfs(v,u);

19         dp[u][0]+=max(dp[v][0],dp[v][1]);

20         dp[u][1]+=dp[v][0];

21     }

22 }

23 

24 int main()

25 {

26     int u,v;

27     while(~scanf("%d",&n)){

28         G.clear();

29         G.resize(n+2);

30         memset(dp,0,sizeof(dp));

31         for(int i=1;i<=n;i++){

32             scanf("%d",&dp[i][1]);

33         }

34         while(~scanf("%d%d",&u,&v)){

35             if(u==0&&v==0)break;

36             G[u].push_back(v);

37             G[v].push_back(u);

38         }

39         dfs(1,-1);

40         printf("%d\n",max(dp[1][0],dp[1][1]));

41     }

42     return 0;

43 }
View Code

 

你可能感兴趣的:(HDU)