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的孩子)。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }