树形DP——没有上司的舞会

  • 题目
  • 算法分析
  • Code
  • 总结与反思

题目

Luogu:P1352 https://www.luogu.com.cn/problem/P1352

题目描述
某大学有 nnn 个职员,编号为 1...n1...n1...n。

他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。

现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数 rir_{i}ri​,但是呢,如果某个职员的直接上司来参加舞会了,那么这个职员就无论如何也不肯来参加舞会了。

所以,请你编程计算,邀请哪些职员可以使快乐指数最大,求最大的快乐指数。

算法分析

每个职员有参加不参加两种选择。以校长结点为根rootrootroot。
1. 设f[x][0]f[x][0]f[x][0]表示从以xxx为根的子树中邀请一部分职员参加,但是xxx不参加,此时的最大快乐值。此时,xxx的儿子结点(也就是xxx的下属),可以参加,或者不参加
转移方程为:(yyy是xxx的儿子结点)f[x][0]=∑max(f[y][0],f[y][1])f[x][0]=∑max(f[y][0],f[y][1])f[x][0]=∑max(f[y][0],f[y][1])
2. 设f[x][1]f[x][1]f[x][1]表示从以xxx为根的子树中邀请一部分职员参加,并且xxx也参加舞会,此时的最大快乐值。此时,xxx的儿子结点,只能选择不参加
转移方程为:(yyy是xxx的儿子结点)f[x][1]=a[x]+∑f[y][0]f[x][1]=a[x]+∑f[y][0]f[x][1]=a[x]+∑f[y][0]
3. 目标就非常的明确了,即 max(f[root][0],f[root][1])max(f[root][0],f[root][1])max(f[root][0],f[root][1])

具体代码见下

Code

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define ll long long
#define rg register
using namespace std;
inline int sread()
{int x=0,f=1;char c=getchar();while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}while(c>='0'&&c<='9') {x=x*10+c-'0'; c=getchar();}return f*x;
}
const int maxn=100000;
int n,cnt;
int h[maxn];
int a[maxn];
struct node{int next;int to;int val;
}edg[10000000];
void add(int u,int v)
{++cnt;edg[cnt].next=h[u];edg[cnt].to=v;h[u]=cnt;
}
int f[8000][5];
int maxx(int a,int b)
{return a>b?a:b;
}
void dfs(int u,int fa)
{f[u][0]=0;f[u][1]=a[u];for(int i=h[u];i;i=edg[i].next){int v=edg[i].to;if(v==fa) continue;dfs(v,u);f[u][0]+=maxx(f[v][0],f[v][1]);f[u][1]+=f[v][0];}
}
int ans;
int pre[1000000];
int main()
{n=sread();for(rg int i=1;i<=n;++i){a[i]=sread();}int x,y;for(rg int i=1;i<n;++i){x=sread();y=sread();pre[y]=x;add(x,y);add(y,x);}int p;for(rg int i=1;i<=n;++i){if(pre[i]==0) p=i;}dfs(p,0);ans=maxx(f[p][1],f[p][0]);printf("%d\n",ans);return 0;
}

总结与反思

1. 二维树形DP 用第二维度表示某种状态。
2. 开数组要合理 如此题中 fff 数组第二维度只有0和1 没必要开那么大。
3. DP要注意分析阶段和目标。
4. 还需要提高码力。





2021.07.31 再刷

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#define rg register
using namespace std;
typedef long long ll;
int sread()
{int x=0,f=1;char c=getchar();while(c>'9'||c<'0') {if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}return f*x;
}
const int maxn=6010;
int n,cnt;
int h[maxn];
struct node{int next;int to_boss;int val_happy;
}tr[maxn*2];
void add(int u,int v)
{++cnt;tr[cnt].next=h[u];tr[cnt].to_boss=v;h[u]=cnt;
}
int pre[maxn];
int f[maxn][2];
void _search(int u,int fa)
{f[u][0]=0;//u不参加f[u][1]=tr[u].val_happy;for(rg int i=h[u];i;i=tr[i].next){int v=tr[i].to_boss;if(v==fa) continue;_search(v,u);f[u][0]+=max(f[v][0],f[v][1]);f[u][1]+=f[v][0];}
}
int main()
{n=sread();for(rg int i=1;i<=n;++i) tr[i].val_happy=sread();int x=0,y=0;for(rg int i=1;i<=n-1;++i){x=sread();    y=sread();pre[y]=x;add(x,y);  add(y,x);}int p=0;for(rg int i=1;i<=n;++i){if(pre[i]==0)  p=i;}_search(p,0);int ans=0;ans=max(f[p][0],f[p][1]);cout<<ans<<endl;return 0;
}

树形DP——没有上司的舞会相关推荐

  1. 【AcWing】数位统计DP、树形DP、状态压缩DP、记忆化搜索

    [AcWing]数位统计DP.树形DP.状态压缩DP.记忆化搜索 一.数位统计DP 二.状态压缩DP 三.树形DP 四.记忆化搜索 一.数位统计DP 计数问题 给定两个整数 a 和 b,求 a 和 b ...

  2. layui树形父子不关联_DP专题7 | 没有上司的舞会 洛谷1352(树形DP)

    高能预警:这是一篇超过5分钟的学习文章,暑假了可以多学会 本篇继续咱们的DP专题,树形DP入门.动态规划每一个类型的DP都是深坑,期望童鞋们自己在这个系列的基础上多花时间进行拓展,学习愉快~ 在讨论树 ...

  3. 洛谷P1352 没有上司的舞会(树形DP水题)

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

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

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

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

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

  6. AcWing285. 没有上司的舞会(树形DP)题解

    题目传送门 题目描述 Ural大学有N名职员,编号为1~N. 他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司. 每个职员有一个快乐指数,用整数 HiHi 给出,其中 1≤i≤N. 现在要 ...

  7. 【SSL1607】没有上司的晚会【树形DP】

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

  8. POJ 3342 树形DP+Hash

    这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...

  9. 0x54. 动态规划 - 树形DP(习题详解 × 12)

    目录 0x54.1 树形DP Problem A. 没有上司的舞会 Problem B. 战略游戏 0x54.2 树上背包 Problem A. 选课 Problem B.[数据加强版]选课(树上背包 ...

最新文章

  1. 主流家用计算机,年终聊装机 主流家用电脑怎么选CPU?
  2. 理解shared_ptrT
  3. kill -HUP 什么意思?
  4. 调试九法(第1次阅读)
  5. 基于JavaSpringboot+Vue实现前后端分离房屋租赁系统
  6. Java与正则表达式
  7. BGP策略路由的实现
  8. 《天天数学》连载16:一月十六日
  9. Java基础(静态static)
  10. java中JFrame.setSize,Java JFrame .setSize(x, y) not working?
  11. 解决XeLaTex编译后中文出现乱码的问题
  12. dos从优盘启动计算机,对老旧电脑升级很重要,教你制作纯DOS的U盘启动盘
  13. OSPF(三)OSPF域内路由
  14. 宋宝华:论一切都是文件之匿名inode
  15. springboot整合mybatis之Invalid bound statement解决
  16. 貝塞爾 Layer 入門指南
  17. 原来PWM这么简单!通过锯齿波作为载波和调制波经过比较,产生相应的PWM输出波形
  18. oracle查询当天的数据(当年,当月,当日)
  19. 计算机408王道考研资料、笔记分享 ~ ~
  20. 计算机网络实验(思科)

热门文章

  1. 系统学习机器学习之总结(二)--样本不平衡问题处理
  2. 2018年计算机等级考试江苏考点联系地点
  3. 关于四大作用域对象的总结
  4. iOS自动化测试辅助工具--Reveal配置及使用
  5. 3/15,别忘记维护你的权利!各地消费者协会网址、投诉电话一览表!
  6. IDEA同时打开多个分支
  7. pcl多视区显示——超方便
  8. SM3加密与解密校验
  9. rust edition python3_mac安装rust的pyo3模块
  10. vue学习记录-05 事件监听