本人第一篇Blog,初学树形DP,心情别样鸡冻...

好了废话不多说,我们来看看题目[传送门]


某大学有N个职员,编号为1~N。他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri,但是呢,如果某个职员的上司来参加舞会了,那么这个职员就无论如何也不肯来参加舞会了。所以,请你编程计算,邀请哪些职员可以使快乐指数最大,求最大的快乐指数。

输入输出格式

输入格式:

第一行一个整数N。(1<=N<=6000)

接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<=Ri<=127)

接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。

最后一行输入0 0

 输出格式:

输出最大的快乐指数。

样例输入:

7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0

样例输出:

5


菜到真实,以泪洗面QAQ

这是一道很经典的树形DP题目,相信我(其实是自己太菜233)

首先我们应该确定一个状态emmm.....

我们以 f[u][1] 表示u号员工回去参加舞会时他的非直属员工的最大快乐值 亚索:我听到有人在呼唤我

相对的 f[u][0] 则表示u号员工没有去的最大快乐值。

很容易就可以得到答案便是max(f[root][1],f[root][0])大老板我劝你善良

可以看出每个人和上司之间是可以连一条边的,那么很容易得到下面的一颗树(注意,这里是单向边,因为需要表示上司和部下的关系)

[好用的图论绘图网页你值得拥有]

可以看出5号节点是根节点(记住,在有向图里面这很重要!!!无向图是可以任选一个点作为根节点),那么怎么找到这颗树的根节点呢???

很简单:一个flag标记和读完后一个循环扫描,原理是因为在无向图中根节点是不可能有任何父亲。

  for(int i=;i<n;++i) scanf("%d%d",&a,&b),add(b,a),flag[a]==true?:flag[a]=true;//这个地方比较坑的就是存边是b是a的父亲。。。
for(int i=;i<=n;++i) if(!flag[i]) root=i;

好了现在是重头戏——DP部分。。。

思想非常简单,和一般树形DP基本一样

先枚举边,再把边给递归传下去emmm

 void dp(int u)
{
for(int i=head[u];i!=-;i=edge[i].nxt)
{
int v=edge[i].to;
dp(v);
f[u][]+=max(f[v][],f[v][]);
f[u][]+=f[v][];
}
f[u][]+=h[u];
}

所以,下面给出完整代码:

 #include<bits/stdc++.h>
namespace Jason{
inline void scan(int &x){
int f=;x=;char s=getchar();
while(s<'' || s>''){if(s=='-') f=-;s=getchar();}
while(s>='' && s<=''){x=x*+s-'';s=getchar();}
x*=f;
}
inline void print(int x){
if(x<){putchar('-');x=-x;}
if(x>)print(x/);char s=x%+'';
putchar(s);
}
}
using namespace std;
using namespace Jason;
const int maxn=+;
//---------------------以下是数据结构
int n,cnt=;
struct Edge{
int to,nxt;//这里用nxt是因为在C++11里面std已经有next了
}edge[maxn<<];int head[maxn];
int h[maxn];
bool flag[maxn];
int f[maxn][];
//----------------------
void add(int u,int v){
edge[++cnt].nxt=head[u];
edge[cnt].to=v;
head[u]=cnt;
} void dp(int u)
{
for(int i=head[u];i!=-;i=edge[i].nxt)
{
int v=edge[i].to;
dp(v);
f[u][]+=max(f[v][],f[v][]);
f[u][]+=f[v][];
}
f[u][]+=h[u];
}
int main(int arrc,char *arrv[])
{
//freopen("in","r",stdin);
memset(head,-,sizeof(head));
int a,b,root;
scan(n);
for(int i=;i<=n;++i) scan(h[i]);
for(int i=;i<n;++i) scan(a),scan(b),add(b,a),flag[a]==true?:flag[a]=true;
scan(a),scan(b);
for(int i=;i<=n;++i) if(!flag[i]) root=i;//找根节点,因为根节点不可能是任意一个点的儿子
dp(root);
print(max(f[root][],f[root][]));
return ;
}

orz欢迎大佬踩我QwQ。。。

【树形DP】洛谷P1352_没有上司的舞会的更多相关文章

  1. 洛谷 P1352 没有上司的舞会【树形DP】(经典)

    <题目链接> <转载于>>> > 题目描述: 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的 ...

  2. 洛谷P1352 没有上司的舞会——树形DP

    第一次自己写树形DP的题,发个博客纪念`- 题目来源:P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结 ...

  3. 洛谷 P1352 没有上司的舞会【树形DP/邻接链表+链式前向星】

    题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...

  4. 洛谷 P1352 没有上司的舞会 树形DP板子

    luogu传送门 题目描述: 某大学有n个职员,编号为1~n. 他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司. 现在有个周年庆宴会,宴会每邀请来一个职员都会 ...

  5. 树形DP 洛谷P2014 选课

    洛谷P2014 选课 题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门 ...

  6. 洛谷 p1352 没有上司的舞会 题解

    P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员 ...

  7. 洛谷P1352 没有上司的舞会

    题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...

  8. 洛谷P1352 没有上司的舞会题解

    题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...

  9. 洛谷P1352 没有上司的舞会 [2017年5月计划 清北学堂51精英班Day3]

    P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子 结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职 ...

随机推荐

  1. Application Context的设计

    基本上每一个应用程序都会有一个自己的Application,并让它继承自系统的Application类,然后在自己的Application类中去封装一些通用的操作.其实这并不是Google所推荐的一种 ...

  2. Django基本设置

    Dango设置流程图片示例: 设置路由时需要注意的一个点是:Django中定义路由时,通常习惯以斜线 / 结尾 其他常用命令: python manage.py runserver 0.0.0.0:8 ...

  3. JS DOM节点增删改查 属性设置

    一.节点操作 增 createElement(name)创建元素 appendChild();将元素添加   删 获得要删除的元素 获得它的父元素 使用removeChild()方法删除 改 第一种方 ...

  4. SSH入门常用命令

    一.参考链接大猫的博客

  5. 9.Java注解(Annotation)

    一.系统内置标准注解 1.@Override 是一个标记注解类型,它被用作标注方法. 它说明了被标注的方法重载了父类的方法,起到了断言的作用.如果我们使用了这种Annotation在一个没有覆盖父类方 ...

  6. Oracle EBS 锁

    这里仅提供查询锁和解锁.有时,锁是正常的,所以杀掉正锁着的进程有一定的风险性. 具体步骤如下: -- 1.0 查看 holder的进程 , 'Holder: ', 'Waiter: ') || sid ...

  7. hyper-v 无线网连接

    本人的工作环境 笔记本一台,window 10系统64位.平时连接的是有线网,今天回到家里,准备继续在Hyper-v虚拟机上进行操作,发现不能连网,自己立马想到了是不是没有虚拟机上没有和主机共享无线网 ...

  8. MySQL学习分享--Thread pool实现

    基于<MySQL学习分享--Thread pool>对Thread pool架构设计的详细了解,本文主要对Thread pool的实现进行分析,并根据Mariadb和Percona提供的开 ...

  9. Nginx 泛解析配置请求映射到多端口实现二级域名访问

    由于想实现一个域名放置多个应用运行的目的,而不想通过域名后加端口号方式处理,这种方式处理记起来太麻烦,偷懒党简直不能忍,故而考虑了使用二级域名来处理多个应用同时运行.Google了一番资料并进行了尝试 ...

  10. CSS学习摘要-语法和选择器

    主要摘自网络开发者. 从最基本的层次来看,CSS是由两块内容组合而成的: 属性(Property):一些人类可理解的标识符,这些标识符指出你想修改哪一些样式,例如:字体,宽度,背景颜色等. 属性值(V ...