标签:
大意:给你一些人的快乐指数,而且满足下级不能与直接上级一起去参加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