codevs 1380 没有上司的舞会

变式题目:给定一棵树每个点有一个点权,求一个独立集使得点权和最大,树上的独立集指的是选取树上的点,使尽量多的点不直接相连

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond 
题目描述 Description

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

输入描述 Input Description

第一行一个整数N。(1<=N<=6000)
接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<=Ri<=127)
接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。
最后一行输入0,0。

输出描述 Output Description

输出最大的快乐指数。

样例输入 Sample Input

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

样例输出 Sample Output

5

数据范围及提示 Data Size & Hint

各个测试点1s

分类标签 Tags

动态规划 树型DP

  1. /*树形Dp:一般以节点作为状态划分的点。
  2. 对于当前的节点代表的人:
  3. 1.这个人去舞会,那么他的下属一定不去,状态转移到子节点
  4. 2.这个人不去舞会,但是他的下属也不一定会去,因为不一定是最优,就是在子节点去与不去间取最优
  5. 树形Dp一般从根节点开始记忆化搜索来实现。
  6. */
  7. #include<iostream>
  8. using namespace std;
  9. #include<cstdio>
  10. #define N 8000
  11. struct Edge{
  12. int v,last;
  13. }edge[N];
  14. bool flag[N];/*找根节点*/
  15. int f[N][],val[N];/*f[i][1]代表当前节点去舞会的这棵子树上快乐最大值,f[i][0]代表当前节点不去舞会的这棵子树上快乐最大值,*/
  16. int head[N]={},cnt=;
  17. int n;
  18. void add_edge(int u,int v)
  19. {
  20. ++cnt;
  21. edge[cnt].v=v;/*建立边表*/
  22. edge[cnt].last=head[u];
  23. head[u]=cnt;
  24. }
  25. void dp(int u)
  26. {
  27. f[u][]=;/*搜索的边界就是没有下属的人,就是f[u][1]=val[u]; f[u][0]=0;*/
  28. f[u][]=val[u];
  29. for(int l=head[u];l;l=edge[l].last)/*对于有下属的人,必须知道他的下属情况才能判断*/
  30. {
  31. int v=edge[l].v;
  32. dp(v);/*搜索下属*/
  33. f[u][]=max(f[u][],f[u][]+f[v][]);/*注意这是在for循环中当前点的f[v][0]会被加了多次,v不同*/
  34. f[u][]=f[u][]+max(f[v][],f[v][]);/*当前节点不去,就判断他的某个子节点去还是不去最优*/
  35. }
  36. }
  37. int main()
  38. {
  39. scanf("%d",&n);
  40. for(int i=;i<=n;++i)
  41. scanf("%d",&val[i]);
  42. for(int i=;i<n;++i)
  43. {
  44. int u,v;
  45. scanf("%d%d",&v,&u);
  46. flag[v]=true;/*给有父节点的点标上标记*/
  47. add_edge(u,v);
  48. }
  49. int u,v;
  50. scanf("%d%d",&u,&v);
  51. for(int i=;i<=n;++i)
  52. if(!flag[i])/*找到根节点*/
  53. {
  54. dp(i);
  55. printf("%d\n",max(f[i][],f[i][]));
  56. break;
  57. }
  58. return ;
  59. }

树形DP--codevs 1380 没有上司的舞会的更多相关文章

  1. codevs 1380 没有上司的舞会 - 树形动态规划

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

  2. 【树形dp入门】没有上司的舞会 @洛谷P1352

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

  3. Codevs 1380 没有上司的舞会

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系就 ...

  4. wikioi 1380 没有上司的舞会 树形dp

    1380 没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他 ...

  5. 树形DP codevs 1814 最长链

    codevs 1814 最长链  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题目描述 Description 现给出一棵N个结点二叉树,问这棵二叉树中 ...

  6. 树形dp|无根树转有根树|2015年蓝桥杯生命之树

    2015年蓝桥杯第十题--生命之树(无根树dfs) ①暴力解法:枚举子集(选点) + dfs判断连通性(题目要求连通)满足上面两个条件下找出最大值权值和 ②dfs无根树转有根树,递归找最优 先学习无根 ...

  7. codevs 1380/HDU 1520 树形dp

    1380 没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 回到问题 题目描述 Description Ural大学有N个职员 ...

  8. Codevs1380没有上司的舞会_KEY

    没有上司的舞会 1380 没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系 ...

  9. POJ_3342_Party at Hali-Bula_树形DP

    POJ_3342_Party at Hali-Bula_树形DP 题意:直接上司和本人不能同时参加,求最多参加人数,并回答是否唯一解. 分析:常规树形DP,需要再维护一下选/不选当前点取得最大值时是否 ...

随机推荐

  1. 爬虫--PySpider框架

    PySpider框架 PySpider框架的作用

  2. php常用代码段

    点击换验证码 <a href=" src="{:U('Reglog/vcode')}" /></a> TP上一条下一条 $prev=$artica ...

  3. phinx:php数据库迁移

    Phinx使你的php app进行数据迁移的过程变得异常轻松,在五分钟之内你就可以安装好Phinx 并进行数据迁移. 特性 使用php代码进行数据迁移 部署模式下迁移 五分钟之内使用 不再担心数据库的 ...

  4. 一款线程安全、基本功能齐全的STL

    MiniSTL 目前正在完成一个STL,主要想通过该项目锻炼C++编程.模板编程.熟悉STL.锻炼数据结构和算法能力. 项目的目标是实现STL的几大构件+线程安全.项目过程中主要参考SGI STL源码 ...

  5. React 16 源码瞎几把解读 【三 点 一】 把react组件对象弄到dom中去(矛头指向fiber,fiber不解读这个过程也不知道)

    一.ReactDOM.render 都干啥了 我们在写react的时候,最后一步肯定是 ReactDOM.render( <div> <Home name="home&qu ...

  6. selenium只打开一个浏览器窗口

    from selenium.webdriver import Remote from selenium.webdriver.chrome import options from selenium.co ...

  7. [ python ] 进程的操作

    目录 (见右侧目录栏导航)- 1. 前言- 2. multiprocess模块- 2.1 multiprocess.Process模块    - 2.2 使用Process模块创建进程    - 2. ...

  8. Codeforces 798D - Mike and distribution(二维贪心、(玄学)随机排列)

    题目链接:http://codeforces.com/problemset/problem/798/D 题目大意:从长度为n的序列A和序列B中分别选出k个下表相同的数要求,设这两个序列中k个数和分别为 ...

  9. #ifndef的用法

    作用:防止头文件的重复包含和编译 定义 #ifndef x #define x ... #endif 这是宏定义的一种,它可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等等.实际上确切的说 ...

  10. scala学习6--collection

     list的下标访问 var t = List(1,2,3,5,5) println(t(2)) map函数 println(t.map(a=> {print("***"+a ...