没有上司的舞会 树形DP

没有上司的舞会 树形DP

 

 

题意:有n个职员可以参加舞会,每个职员有一个欢乐值,职员之间就像一颗树,每个父节点都是子节点的上司,同时一个职员不可以他的直接上司一起参加,。现在选一些员工参加舞会,求参加员工的可能最大快乐值。

做法:设f[i][0]表示i代表的子树之下,i职员不参加的最大快乐值,f[i][1]表示i代表的子树之下,i职员参加的最大快乐值。则状态转移方程得

f[i][0]+=max(f[j][1],f[i][0])如果i不参加,那么他的每个儿子j可以选择参加或者不参加,累加每个儿子的较大的值。

f[i][1]+=f[j][0]如果i参加,那么它需要累加它每个儿子不参加时的最大快乐值。

然后就是从顶头上司根节点开始,深度优先遍历即可

#include<bits/stdc++.h>
using namespace std; int f[1005][2]; int val[1005]; vector<int> v[1005]; int ans; int vis[1005]; void dp(int t) { f[t][0]=0; f[t][1]=val[t]; for(int i=0;i<v[t].size();i++) { int y=v[t][i]; dp(y); f[t][0]+=max(f[y][1],f[y][0]); f[t][1]+=f[y][0]; } } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&val[i]); for(int i=1;i<=n-1;i++) { int a,b; scanf("%d%d",&a,&b); v[b].push_back(a); vis[a]=1; } int root; for(int i=1;i<=n;i++) { if(vis[i]==0) { root=i;break; } } dp(root); printf("%d",max(f[root][1],f[root][0])); }

 

转载于:https://www.cnblogs.com/dongdong25800/p/10834719.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100939.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql获取当前时间前一天_mysql删除数据表命令

    mysql获取当前时间前一天_mysql删除数据表命令1.current_timestamp2.current_time3.current_data4.now()5.curdate()6.curtime()将当前时间插入数据库insertintot_login(user_id,login_time)values(1,CURRENT_TIMESTAMP);…

    2022年10月19日
    4
  • redis设置不过期_redis设置key的过期时间命令

    redis设置不过期_redis设置key的过期时间命令redis拿K,如果v为空.直接设置过期时间expire.是不生效的.更不能在最下面设置过期时间,大并发时,照样不生效.所以得在设置值的时候同时设置过期时间

    2022年9月26日
    4
  • Java多态实现原理

    Java多态实现原理##前言多态是Java语言重要的特性之一,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。Java对于方法调用动态绑定的实现主要依赖于方法表,但通过引用调用(invokevitual)和接口引用调用(invokeinterface)的实现则有所不同。Java多态实现原理的大致过程:首先是Java编译器将Java源代码编译成class文件。在编译过程中,会根据静态类型将调用的符号引用写到class文件中。在执行时,JVM根据class文件找到调用方法的符号引用,然后在静态类型的方

    2022年7月7日
    21
  • git学习—git log 和git diff

    大概整理一下,供自查看 gitdiff和 git log 对比两个分支差异

    2022年2月25日
    52
  • Java的invoke方法[通俗易懂]

    Java的invoke方法[通俗易懂]如果读一些Java或者相关框架的源码,实际上一定会经常出现invoke方法的调用,在自己或者团队封装框架时,如果有时候弄得不好经常也会报invoke相关的错。invoke方法是干什么的?有什么具体用途?首先要了解invoke方法干什么的以及具体用途,实际你要搞清他在源码那个class文件上,他在那个包里,追根溯源。invoke方法来自Method类,可能不会像我们经常用到的基础类型包装类,以及集合类还有他们的扩展和工具类使用的那么多。但是Method类所在的包可是大名鼎鼎的反射Reflact,不是有

    2022年6月7日
    33
  • Arduino 和LCD1602液晶屏 I2C接口实验「建议收藏」

    LCD1602液晶屏带I2C接口为什么使用I2C接口?因为省IO口啊,只需要4条线,可以看看之前发的实验,接线多复杂呀,对吧。(传送门:Arduino携手LCD1602向世界问好“helloWorld!”)还有背光灯,和可调节对比度(就是背面蓝色那块可以旋转的调)具体怎么实现解决问题,请往下看引脚说明GND——地线VC…

    2022年4月14日
    263

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号