http://poj.org/problem?id=2342
树形dp:
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<vector> 5 using namespace std; 6 7 const int mx=6006; 8 int dp[mx][2]; 9 vector<int>g[mx]; 10 int n; 11 12 void dfs(int x) 13 { 14 for (int i=0;i<g[x].size();i++) 15 { 16 int j=g[x][i]; 17 dfs(j); 18 dp[x][1]+=dp[j][0]; 19 dp[x][0]+=max(dp[j][1],dp[j][0]); 20 } 21 } 22 23 int main() 24 { 25 while (~scanf("%d",&n)) 26 { 27 if (!n) 28 { 29 scanf("%d",&n); 30 if (!n) return 0; 31 } 32 memset(dp,0,sizeof(dp)); 33 for (int i=1;i<=n;i++) scanf("%d",&dp[i][1]),g[i].clear(); 34 int l,k,root=1; 35 for (int i=1;i<n;i++) 36 { 37 scanf("%d%d",&l,&k); 38 g[k].push_back(l); 39 if (root==l) root=k; 40 } 41 dfs(root); 42 printf("%d ",max(dp[root][1],dp[root][0])); 43 } 44 return 0; 45 }