华山论剑(没有上司的舞会)

题目描述

一日,小策如往常一般打开了自己的传奇,刚上线不久,就收到了帮主的私信。原来帮派里要召开一次武功比拼,让他来邀请各帮派人员,因为有些侠客还是萌新,所以需要小策挨个选取战力高的侠客。

本帮派——华山,实行了师徒制,每位侠客都有自己的师傅,师傅也有自己的师傅,一直到本帮派帮主。

每位侠客都有自己的战力,因为本次比拼会在全区直播,大家肯定愿意看更加激烈的战斗,所以肯定是战力越高越好。

但是还有一个要求,当邀请了一位侠客的师傅的时候,便不能再邀请那位侠客了。

请你帮助小策来计算,邀请哪些侠客可以使武会的战力总和最大,求最大的战力总和。

注:并不是师傅的战力一定比徒弟高,也有“青出于蓝而胜于蓝”的情况,但是师徒关系是不变的。

为了便于计算,我们将每位侠客表上编号 \((1...n)\) 。

输入格式

第 \(1\) 行是一个整数 \(n\) ,表示有 \(n\) 个侠客;\((1\leq n\leq 6000)\)

第 \(2\) 行到第 \((n+1)\) 行,每行一个整数,第 \((i+1)\) 行的整数表示第 \(i\) 号侠客的战力值 \(r (-128\leq r\leq 127)\) (这里你们可能会疑惑了,但是玩游戏怎么不会有个坑逼呢,拉低全员战力)

第 \((n+2)\) 行到第 \((2n+1)\) 行,每行输入一堆整数 \(x\),\(y\),表示 \(y\) 是 \(x\) 的师傅

最后一行输入 \(0,0\)

输出格式

输出一行一个整数代表最大的战力总和

样例

样例输入

3
52
42
36
1 3
3 2
0 0

样例输出

94

基本思路

根据题目判断,由于有徒弟师傅这种关系,可以讲整个帮派看成一整颗树,帮主便是树根,每位侠客的战力值便是每个树节点的权值,现在就可以判断整个题就是对树形 \(dp\) 的考察。

但是与常规树形 \(dp\) 不同的是,这个题有个限制条件,便是:父节点被选中时,他的子节点便不能被选中了。

如果说仅仅定义一个一维的 \(dp[i]\) ,无法进行限制条件的判断。

所以,需要定义一个二维的 \(dp[i][j]\) ,表示的是以 \(i\) 为根节点的子树,\(i\) 去不去时的最大战力值,\(j\) 表示 \(i\) 去不去的状态,\(j=1\) 便是 \(i\) 去,\(j=0\) 便是 \(i\) 不去。

那么状态转移方程便可以得出:

师傅来,徒弟不能来。师傅不来,徒弟就能来。所以,决策便是师傅到底来不来,即对 \(dp[i][j]\) 中的 \(j\) 讨论取 \(1\) 还是取 \(0\) 了。

for(int i=head[now];i;i=e[i].next){
dp[now][flag]+=dfs(e[i].to,!flag);
}

剩下的就注意有负的战力值,初始化的时候就需要注意一下。

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=10000+50;
struct Edge{
int next;
int to;
}e[maxn];
int dp[maxn][2];
int a[maxn];
int in[maxn];
int head[maxn];
int cnt=0;
int n,x,y,root;
void insert(int u,int v){
e[++cnt].next=head[u];
head[u]=cnt;
e[cnt].to=v;
in[v]++;
}
int dfs(int now,bool flag){
if(!head[now]){
if(flag){
return a[now];
}else{
return 0;
}
}
for(int i=head[now];i;i=e[i].next){
dp[now][flag]+=dfs(e[i].to,!flag);
}
return dp[now][flag];
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++){
dp[i][1]=max(a[i],0);
}
for(int i=1;i<n;i++){
scanf("%d%d",&x,&y);
insert(y,x);
}
scanf("%d%d",&x,&y);
for(int i=1;i<=n;i++){
if(!in[i]){
root=i;
break;
}
}
dfs(root,0);
dfs(root,1);
cout<<max(dp[root][0],dp[root][1])<<endl;
return 0;
}

华山论剑(没有上司的舞会)——树形dp的更多相关文章

  1. [luogu]P1352 没有上司的舞会[树形DP]

    本Lowbee第一次写树形DP啊,弱...一个变量写错半天没看出来...... 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点 ...

  2. 『没有上司的舞会 树形DP』

    树形DP入门 有些时候,我们需要在树形结构上进行动态规划来求解最优解. 例如,给定一颗\(N\)个节点的树(通常是无根树,即有\(N-1\)条无向边),我们可以选择任意节点作为根节点从而定义出每一颗子 ...

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

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

  4. CodeVS1380 没有上司的舞会 [树形DP]

    题目传送门 没有上司的舞会 题目描述 Description Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.每个职员有一个 ...

  5. 没有上司的舞会 树形dp

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

  6. P1352 没有上司的舞会——树形DP入门

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

  7. P1352 没有上司的舞会[树形dp]

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

  8. P1352 没有上司的舞会&&树形DP入门

    https://www.luogu.com.cn/problem/P1352 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的 ...

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

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

  10. 【codevs1380】没有上司的舞会 树形dp

    题目描述 Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.每个职员有一个快乐指数.现在有个周年庆宴会,要求与会职员的快乐指数 ...

随机推荐

  1. [OpenGL](翻译+补充)投影矩阵的推导

    1.简介 基本是翻译和补充 http://www.songho.ca/opengl/gl_projectionmatrix.html 计算机显示器是一个2D的平面,一个3D的场景要被OpenGL渲染必 ...

  2. 数组 & 链表

    数组 是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据. 使用了连续的内存空间和相同类型的数据,使得它可以“随机访问”,但同时也让数组的删除,插入等操作变得非常低效, 为了保 ...

  3. Android下的缓存策略

    Android下的缓存策略 内存缓存 常用的内存缓存是软引用和弱引用,大部分的使用方式是Android提供的LRUCache缓存策略,本质是个LinkedHashMap(会根据使用次数进行排序) 磁盘 ...

  4. 源码分析 | 手写mybait-spring核心功能(干货好文一次学会工厂bean、类代理、bean注册的使用)

    作者:小傅哥 博客:https://bugstack.cn - 汇总系列原创专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言介绍 一个知识点的学习过程基本分为:运行helloworld ...

  5. nginx下如何l在网站目录的二级目录下url重写的方法

    以我新项目为例子,该项目要求用laravel来做,因此我把整个项目丢到一个叫laravel的文件夹里面了,目录就变成c:/nginx/html/laravel了,然后发现只能通过localhost/l ...

  6. C# .net framework .net core 3.1 请求参数校验, DataAnnotations, 自定义参数校验

    前言 在实际应用场景中我们常常要对接口的入参进行校验, 例如分页大小是否正确, 必填参数是否已经填写等等. 最简单的实现方式如下图, 这种在实际开发中代码过于冗余, 而且不灵活. 今天介绍一种统一参数 ...

  7. [转] Ubuntu的apt-get 设置代理的方法

    点击阅读原文 新立得软件管理器这种图形化的代理设置很明了,这里介绍下终端命令行的网络代理设置,这样大家就可以通过代理进行apt-get了. 方法一: 如果只是想临时使用http代理,可以在使用apt- ...

  8. 千万不要更新网易云音乐UWP!!!!!

    网易云音乐UWP没了!!! 现在 Micrsoft Store 里面的是垃圾 Win32 转置版!!!! 万不可更新!!! 若已经更新,还有救回来的办法:下载 https://lanzous.com/ ...

  9. Latex 安装 教程

    需要安装texlive和编辑器texstudio. 安装教程如https://www.cnblogs.com/dingruihfut/p/9690073.html

  10. Ubuntu U盘启动出现“Failed to load ldlinux.c32”解决

    最后用ultraISO软碟通,刻录映像时写入方式选择”RAW”,成功解决!!!