-
A - Anniversary party
- HDU - 1520
- 树形DP-模板
- 题意:有个公司要举行一场晚会。为了让到会的每个人不受他的直接上司约束而能玩得开心.
- 公司领导决定:如果邀请了某个人,那么一定不会再邀请他的直接的上司,但该人的上司的上司.
- 上司的上司的上司……都可以邀请。已知每个人最多有唯一的一个上司。
- 已知公司的每个人参加晚会都能为晚会增添一些气氛,求一个邀请方案,使气氛值的和最大
- 树形DP DFS递归到叶子节点开始回溯,父亲去只能由儿子不去来更新,父亲不去则可以在儿子去
- 或不去中选择一个最大值。
-
#include<bits/stdc++.h> using namespace std; #define maxn 6666 int happy[maxn],pre[maxn]; int dp[maxn][maxn],a,b,n; vector<int>edge[maxn]; void dfs(int cur) { dp[cur][1]=happy[cur]; int len =edge[cur].size(); for(int i=0; i<len; i++) { int son=edge[cur][i]; dfs(son); dp[cur][0]+=max(dp[son][1],dp[son][0]); dp[cur][1]+=dp[son][0]; } } int main() { while(~scanf("%d",&n)) { for(int i=1; i<=n; i++) { scanf("%d",&happy[i]); edge[i].clear(); dp[i][0]=dp[i][1]=0; pre[i]=-1; } while(1) { scanf("%d%d",&a,&b); if(a==0&&b==0)break; edge[b].push_back(a); pre[a]=b; } int root=1; while(pre[root]!=-1)root=pre[root]; dfs(root); printf("%d\n",max(dp[root][0],dp[root][1])); } return 0; }
A - Anniversary party HDU - 树形DP
最新推荐文章于 2019-01-04 15:22:00 发布