标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6058 Accepted Submission(s): 2743
思路:dp[i][0], dp[i][1]分别表示不取节点 i 上的值和取节点 i 上的值后,以 i 为根的树在满足题目要求的下能得到的最大值
叶子节点:dp[i][0] = 0, dp[i][1] = v[i] ;
非叶子节点: dp[i][0] = sum( max( dp[j][0], dp[j][1] ) ) , dp[i][1] = sum( dp[j][0] ) + v[i] ;
1 #include <cstdio> 2 #include <iostream> 3 #include <cstdlib> 4 #include <algorithm> 5 #include <cstring> 6 #include <vector> 7 #include <map> 8 using namespace std ; 9 const int N = 6050 ; 10 int v[N], dp[N][2] ; 11 vector<int> G[N] ; 12 int n, root, vis[N] ; 13 void _in() 14 { 15 memset(vis, 0, sizeof vis) ; 16 for(int i = 0; i <= n; ++i) G[i].clear() ; 17 for(int i = 1; i <= n; ++i) scanf("%d",&v[i]) ; 18 int u, v ; 19 while(1){ 20 scanf("%d%d",&v,&u) ; 21 if(!v && !u) break ; 22 vis[v] = 1 ; 23 G[u].push_back(v) ; 24 } 25 for(int i = 1; i <= n; ++i) 26 if(!vis[i]) { root = i ; break; } 27 //printf("%d--\n",root) ; 28 } 29 int get(int root, int c) 30 { 31 int& res = dp[root][c] ; 32 if(res != -1) return res ; 33 int sx = G[root].size() ; 34 if(c) res = v[root] ; 35 else res = 0 ; 36 for(int i = 0; i < sx; ++i) 37 if(c) res += get(G[root][i],0) ; 38 else res += max(get(G[root][i],0), get(G[root][i],1)) ; 39 return res ; 40 } 41 int main() 42 { 43 #ifdef LOCAL 44 freopen("in.txt","r",stdin) ; 45 #endif 46 while(~scanf("%d",&n)){ //多case,囧 47 _in() ; 48 memset(dp, -1, sizeof dp) ; 49 printf("%d\n",max(get(root,0), get(root,1))) ; 50 } 51 return 0 ; 52 53 }
标签:
原文地址:http://www.cnblogs.com/orchidzjl/p/4536901.html