标签:
大意:给你一些人的快乐指数,而且满足下级不能与直接上级一起去参加party,求最大的快乐指数
定义 dp[i][j] 表示第i个人去还是没去
状态转移方程 dp[x][1] += dp[G[x][i]][1];
dp[x][0] += max(dp[G[x][i]][1],dp[G[x][i]][0]);
用并查集的思想找到根,对着根进行DFS
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; int dp[6100][2]; int t[6100]; int f[6100]; vector<int> G[6100]; void dfs(int x) { dp[x][1] = t[x]; for(int i = 0; i < G[x].size(); i++){ dfs(G[x][i]); } for(int i = 0 ; i < G[x].size();i++){ dp[x][1] += dp[G[x][i]][0]; dp[x][0] += max(dp[G[x][i]][1],dp[G[x][i]][0]); } } int main() { int n,a,b; while(~scanf("%d",&n)){ for(int i = 1; i <= n; i++) G[i].clear(); for(int i = 1; i <= n ; i++) scanf("%d",&t[i]); memset(f,-1,sizeof(f)); memset(dp,0,sizeof(dp)); while(~scanf("%d%d",&a,&b)){ if(a == 0 && b == 0) break; G[b].push_back(a); f[a] = b; } // for(int i = 1; i<= n ;i++) // printf("%d ",f[i]); int x = 1; while(f[x]!= -1) { x = f[x]; } dfs(x); printf("%d\n",max(dp[x][0],dp[x][1])); } return 0; }
HDU1520——树形DP——Anniversary party
标签:
原文地址:http://www.cnblogs.com/zero-begin/p/4520928.html