寒假练习 1018 没有上司的聚会
2013-04-01 22:44
211 查看
树形DP的问题
题目大意:有一群人,有上下级关系,每人都有一定的欢乐值
下级不能和直接上司一同去参加聚会,要求出最终的最大的欢乐值
依照题意可以建造一颗树形结构的图(用邻接表储存,速度快)
对于某个结点x,dp[x][]表示以x为根结点的子树的最大欢乐值
那么,dp[x][0]代表x不去参加聚会所能得到的最大欢乐值
dp[x][1]代表x去参加聚会所能得到的最到欢乐值
可以得到状态转移方程
dp[rt][0]=sum(max(dp[child][0],dp[child][1]))
dp[rt][1]=sum(dp[child][0])
接下来的工作就是DFS这颗树,然后进行DP就可以
最后的结果就是root节点的max(dp[root][0],dp[root][1])
题目大意:有一群人,有上下级关系,每人都有一定的欢乐值
下级不能和直接上司一同去参加聚会,要求出最终的最大的欢乐值
依照题意可以建造一颗树形结构的图(用邻接表储存,速度快)
对于某个结点x,dp[x][]表示以x为根结点的子树的最大欢乐值
那么,dp[x][0]代表x不去参加聚会所能得到的最大欢乐值
dp[x][1]代表x去参加聚会所能得到的最到欢乐值
可以得到状态转移方程
dp[rt][0]=sum(max(dp[child][0],dp[child][1]))
dp[rt][1]=sum(dp[child][0])
接下来的工作就是DFS这颗树,然后进行DP就可以
最后的结果就是root节点的max(dp[root][0],dp[root][1])
#include<stdio.h> #include<stdlib.h> #include<string.h> #define maxn 100006 #define max(a,b) a>b?a:b int dp[maxn][2]; int all; struct node{ int from; int to; int next; }edge[maxn]; int head[maxn]; int base[maxn]; bool vis[maxn]; void add(int a,int b) { edge[all].from = a; edge[all].to = b; edge[all].next = head[a]; head[a] = all++; } void dfs(int rt) { dp[rt][0] = 0; //不去则欢乐值为0 dp[rt][1] = base[rt]; //去则有其欢乐值 for(int i=head[rt];i!=-1;i=edge[i].next) { int child = edge[i].to; dfs(child); //动态转移方程 //dp[rt][0]=sum(max(dp[child][0],dp[child][1])) //dp[rt][1]=sum(dp[child][0]) dp[rt][0] += max(dp[child][0],dp[child][1]); dp[rt][1] += dp[child][0]; } } int main() { int N; while(~scanf("%d",&N)) { all = 0; for(int i=1;i<=N;i++) scanf("%d",&base[i]); memset(head,-1,sizeof(head)); memset(vis,false,sizeof(vis)); memset(dp,0,sizeof(dp)); int a,b; for(int i=1;i<N;i++) { scanf("%d%d",&a,&b); vis[a] = true; add(b,a); } int begin; for(int i=1;i<=N;i++) //找到总Boss { if(vis[i] == false) { begin = i; break; } } dfs(begin); printf("%d\n",max(dp[begin][0],dp[begin][1])); } return 0; }
相关文章推荐
- 2013寒假练习 1018:没有上司的聚会
- BIT 1018 没有上司的聚会
- BIT1018 没有上司的聚会
- 没有上司的聚会
- codevs 1380 没有上司的舞会 - 树形动态规划
- 【codevs1380】没有上司的舞会 树形dp
- codevs1380 没有上司的舞会
- 1380 没有上司的舞会
- 寒假训练--图的基本知识--图结构练习——BFS——从起始点到目标点的最短步数
- 没有上司的舞会(树状DP)
- codevs1380 没有上司的舞会
- POJ 2342 Anniversiry Party(TYVJ1052 没有上司的舞会)
- 树形dp最大独立集(洛谷1352 没有上司的舞会)
- 2018年全国多校算法寒假训练营练习比赛(第二场) G 送分了QAQ(数位DP 或打表区间 水)
- 2018年全国多校算法寒假训练营练习比赛(第二场) A 吐泡泡(模拟)
- 2018年全国多校算法寒假训练营练习比赛(第二场) B TaoTao要吃鸡 (0 1背包 特殊处理一个物品)
- 2018年全国多校算法寒假训练营练习比赛(第二场) E 小G有一个大树(树状DP 未解决)
- 2018年全国多校算法寒假训练营练习比赛(第三场)题解
- 2018年全国多校算法寒假训练营练习比赛(第二场)G 送分了QAQ
- 2018年全国多校算法寒假训练营练习比赛(第一场) - D - N阶汉诺塔变形(模拟)