题目链接:点击查看

题目大意:每个人都有一个快乐值,给定一个树状的从属关系,仅当上司和下属都不在的时候这个个人的快乐值才能表现出来,问怎么样才能让整体的快乐值达到最大

题目分析:做线段树做吐了,来换换思维,入门的树形dp题一道,树形dp,简明扼要的说就是在树上做的动态规划,那么就离不开转移方程了,这个题的状态有两个,来或者不来,有点像背包问题的选与不选,那么我们就假设dp[i][j]代表第i个人的状态为j时的最大快乐值,j分为0或1,0代表不来,1代表来,那么可以将第i个人视为根节点,然后递归到叶节点再往上逐层更新即可,这个题的转移方程还算简单的:

dp[i][0]+=max(dp[j][0],dp[j][1]),j为i的儿子,因为i不去,所以j去不去无所谓

dp[i][1]+=dp[j][0],j为i的儿子,因为i要去,所以j不能去

这个题还有个关键点是找到根节点然后dfs,我是用的入度的关系,根节点的入度一定为0,所以加一个辅助数组来记录一下每条边的入度就好了

直接上代码了:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
#include<cmath>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=6e3+100;int dp[N][2];//dp[i][0]表示当i为根节点时i位置不放的最大值,dp[i][1]表示当i为根节点时i位置放的最大值
//所以dp[i][0]+=max(dp[j][0],dp[j][1])j为i的儿子,因为i不去,所以j去不去无所谓
//dp[i][1]+=dp[j][0]j为i的儿子,因为i要去,所以j不能去vector<int>node[N];int num[N];//用来存储每个点的入度,若入度为0,则为根节点void dfs(int u)
{for(int i=0;i<node[u].size();i++){int v=node[u][i];dfs(v);dp[u][0]+=max(dp[v][0],dp[v][1]);dp[u][1]+=dp[v][0];}
}int main()
{
//  freopen("input.txt","r",stdin);int n;while(scanf("%d",&n)!=EOF){for(int i=1;i<=n;i++){scanf("%d",&dp[i][1]);node[i].clear();}memset(num,0,sizeof(num));int u,v;while(scanf("%d%d",&v,&u)!=EOF&&v+u){node[u].push_back(v);num[v]++;}int root;for(int i=1;i<=n;i++)if(!num[i]){root=i;break;}dfs(root);cout<<max(dp[root][0],dp[root][1])<<endl;}return 0;
}

POJ - 2342 Anniversary party(树形dp入门)相关推荐

  1. POJ 2342 | HDU 1520 Anniversary party 树形DP(入门题)

    传送门:POJ 2342 题目大意: 有若干人参加一个聚会,如果两个人之间有直接的上下属关系,则只能去一个.每个人都有个高兴值,问高兴值之和最大是多少? 思路: 之前一直觉得树形DP比较难,现在发现树 ...

  2. HDU - 1520 Anniversary party [树形dp]

    Anniversary party 时限:1000ms Problem Description There is going to be a party to celebrate the 80-th ...

  3. 树形DP入门题目推荐以及解析

    关于树形DP几道入门题目 今天恶补树形DP,感觉海星. 其实挺简单的. 介绍几道例题,我会的. 1.洛谷P1352 没有上司的舞会 我的一篇题解 我们可以考虑每一个节点都是有两种情况. 一个是被邀请: ...

  4. hdu_Anniversary party_(树形DP入门题)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意:有N个人,N-1个人有自己的上司,每个人有一个快乐值,如果这个人参加了聚会,那么这个人的直 ...

  5. 【树形DP】树形DP入门详解+例题剖析

    树形DP 树形DP准确的说是一种DP的思想,将DP建立在树状结构的基础上.整体的思路大致就是用树形的结构存储数据. 要学树形DP之前肯定是要先学会树和图的呀,至少先学会链式前向星,不会的话可以看一下我 ...

  6. POJ - 4045 Power Station(树形dp/树的重心)

    题目链接:点击查看 题目大意:给出一个n个节点的树,我们需要选出一个节点,到其余任何节点的距离和最小 题目分析:这个题我的第一反应是用树的重心,先求出来符合条件的点,然后再跑一遍dfs求距离,最后输出 ...

  7. POJ 3585 Accumulation Degree 树形dp

    题目链接 Accumulation Degree Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5388   Accepte ...

  8. 树形DP入门(二叉苹果树+没有上司的舞会)

    树形dp学习笔记 - _Lancy - 博客园二叉苹果树 二叉苹果树 没有上司的舞会 二叉苹果树的处理可以说是非常模板了,正常容易联想到倒过来的数字三角形 for(int i=n;i>=1;i- ...

  9. POJ 3342- Party at Hali-Bula (树形dp+判断是否唯一)

    题目: Dear Contestant, I'm going to have a party at my villa at Hali-Bula to celebrate my retirement f ...

最新文章

  1. B树、B+树、AVL树、红黑树
  2. TF-A代码阅读: SP_EL3栈内存-cpu_data内存的介绍(cpu_context介绍)
  3. tea java 代码,TeaVM编译器如何将Java应用程序转换为Javascript,以及如何使用MicroK8管理嵌入...
  4. 学习java之利用泛型访问自己定义的类
  5. 数据挖掘:模型选择——线性回归
  6. [SHELL进阶] (转)最牛B的 Linux Shell 命令 (三)
  7. python连接mysql代码_Python连接MySQL及基本操作代码
  8. hcfax2e伺服驱动器说明书_伺服电机说明书
  9. 编程实现之k均值算法
  10. 数据库表设计:一对一、一对多、多对多
  11. 牛客练习赛47 B:DongDong认亲戚 (并查集)
  12. 2016年全球超级计算机榜首是,中国神威·太湖之光荣登全球超级计算机500强榜首...
  13. 天蓝色在ps中的色值_天蓝色事件网格集成测试
  14. 准备入行java怎么才能更快学习
  15. pyttsx3 快速上手之:语音合成播报
  16. 关于ZBRUSH弯折功能使用问题
  17. 李彦宏说百度吹的牛都实现了,还扔出来一个ACE计划
  18. Git如何修改commit信息
  19. 1455 Oulipo
  20. Matlab中解决pcolor和imagesc格网显示问题

热门文章

  1. SpringSecurity案例之把资源交给OAuth2的资源服务管理
  2. SpringSecurity分布式整合之实现思路分析
  3. RocketMQ实现原理
  4. MySQL 数据存储文件
  5. 用注解还是用xml 配置?
  6. ActiveMQ入门-ActiveMQ环境搭建
  7. 使用RSA算法解析令牌
  8. 新增房源服务实现之AutoGenerator使用以及创建pojo对象
  9. Spring--SPeL
  10. linux 内核dmesg,linux內核調試kmsg,dmesg