标签:
Description
Input
Output
Sample Input
7 1 1 1 1 1 1 1 1 3 2 3 6 4 7 4 4 5 3 5 0 0
Sample Output
5
树形dp
1 //2016.8.7 2 #include<iostream> 3 #include<cstdio> 4 #include<vector> 5 #include<algorithm> 6 #include<cstring> 7 8 using namespace std; 9 10 const int maxn = 6005; 11 int dp[maxn][2];//dp[i][j]表示i节点的子树的最大happy值,j==1时i不去,j==0时i去 12 int happy[maxn], fa[maxn];//fa[i]表示i节点的父亲 13 vector<int> v[maxn];//用来保存v[i]的儿子 14 15 int dfs(int r) 16 { 17 int len = v[r].size(); 18 dp[r][1] = happy[r]; 19 for(int i = 0; i < len; i++) 20 dfs(v[r][i]);//使得从叶子节点先计算 21 for(int i = 0; i < len; i++) 22 { 23 dp[r][0] += max(dp[v[r][i]][0], dp[v[r][i]][1]);//r不去 24 dp[r][1] += dp[v[r][i]][0];//r去 25 } 26 } 27 28 int main() 29 { 30 int n, l, k; 31 while(cin>>n) 32 { 33 memset(dp, 0, sizeof(dp)); 34 for(int i = 1; i <= n; i++) 35 { 36 scanf("%d", &happy[i]); 37 fa[i] = -1; 38 v[i].clear();//初始化 39 } 40 while(cin>>l>>k&&l&&k) 41 { 42 fa[l] = k; 43 v[k].push_back(l); 44 } 45 int root = 1; 46 while(fa[root] != -1)root = fa[root];//节点的父亲为-1时,此节点为根 47 dfs(root); 48 cout<<max(dp[root][0],dp[root][1])<<endl; 49 } 50 51 return 0; 52 }
标签:
原文地址:http://www.cnblogs.com/Penn000/p/5747295.html