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

 

posted @ 2013-09-10 23:20  ihge2k  阅读(273)  评论(0编辑  收藏  举报