背景

十八居士的毕业典礼(1)

描述

福州时代中学2009届十班同学毕业了,于是班长PRT开始筹办毕业晚会,但是由于条件有限,可能每个同学不能都去,但每个人都有一个权值,PRT希望来的同学们的权值总和最大。

十班有一个周密的电话通知网络,它其实就是一棵树,根结点为班长PRT,由她来负责通知她的下线(也就是儿子节点),下线们继续通知自己的下线(不一定每个下线都要通知),任何人都可以不去:”
为了使权值总和最大,班长想安排一下人,但是人数很多,人脑是难以应付的,所以她找到十八居士,让他编程用电脑解决。

格式

输入格式

输入第一行两个整数n,m表示有n位同学,至多只能去m位同学。(1<=m<=n)
接下来2*n行,每两行代表一个同学的信息(如果这位同学没有子节点,就只有一行)。

每个同学的第一行两个整数p,s,表示这位同学权值为p,子节点个数s;(-100<=p<=100)
第二行s个整数,表示这位同学的子节点的编号。

班长的编号一定为1。

对于20%数据1<=n<=10
对于60%数据1<=n<=100
对于100%数据1<=n<=1000

输出格式

输出一个整数,表示权值的最大值。

样例

样例输入1

  1. 8 5
  2. 100 2
  3. 2 3
  4. 79 2
  5. 4 5
  6. 109 3
  7. 6 7 8
  8. 100 0
  9. 100 0
  10. 100 0
  11. 101 0
  12. 108 0

样例输出1

  1. 518

My Solution

id序列树形dp!!!

神秘!

  1. const int maxn=;
  2. int d[maxn]; -------->WA!!!!
  3.  
  4. int d[]; -------->AC!!!!

于是我改成了

  1. const int maxn=;
  2. int d[maxn];

AC!!!

C++基本的东西还要多学

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<vector>
  5. using namespace std;
  6. #define inf 0x3f3f3f3f
  7.  
  8. inline int read(){
  9. int re=;
  10. char ch;
  11. bool flag=;
  12. while((ch=getchar())!='-'&&(ch<''||ch>''));
  13. ch=='-'?flag=:re=ch-'';
  14. while((ch=getchar())>=''&&ch<='') re=(re<<)+(re<<)+ch-'';
  15. return flag?-re:re;
  16. }
  17.  
  18. struct edge{
  19. int to,next;
  20. edge(int to=,int next=):
  21. to(to),next(next){}
  22. };
  23.  
  24. const int maxn=;
  25.  
  26. vector<edge> edges;
  27. int n,m;
  28. int head[maxn];
  29. int w[maxn],num[maxn];
  30. int dp[maxn][maxn];
  31. int id[maxn],count[maxn],q=;
  32. int root=;
  33. int cnt=;
  34. int ans=-inf;
  35.  
  36. inline void add_edge(int from,int to){
  37. edges.push_back(edge(to,head[from]));
  38. head[from]=++cnt;
  39. }
  40.  
  41. void init(){
  42. n=read(); m=read();
  43. edges.push_back(edge(,));
  44. for(int i=;i<=n;i++){
  45. w[i]=read();
  46. num[i]=read();
  47. for(int j=;j<=num[i];j++){
  48. int to=read();
  49. add_edge(i,to);
  50. }
  51. }
  52. }
  53.  
  54. void dfs(int x){
  55. id[++q]=x;
  56. count[x]=;
  57. for(int ee=head[x];ee;ee=edges[ee].next){
  58. dfs(edges[ee].to);
  59. count[x]+=count[edges[ee].to];
  60. }
  61. }
  62.  
  63. void solve(){
  64. memset(dp,-,sizeof dp);
  65. dfs(root);
  66. for(int i=;i<=n;i++){
  67. dp[i][]=;
  68. dp[i][]=w[id[i]];
  69. }
  70. for(int i=n-;i>;i--)
  71. for(int j=;j<=m;j++)
  72. dp[i][j]=max(dp[i+][j-]+w[id[i]],dp[i+count[id[i]]][j]);
  73. for(int i=;i<=m;i++)
  74. ans=max(ans,dp[][i]);
  75. printf("%d\n",max(ans,));
  76. }
  77.  
  78. int main(){
  79. //freopen("temp.in","r",stdin);
  80. init();
  81. solve();
  82. return ;
  83. }

于是他走了  就像他没有来过一样

  1.  

[vijos 1642]班长的任务 [树形dp]的更多相关文章

  1. Vijos p1892 树上的最大匹配 树形DP+计数 被卡常我有特殊技巧heheda

    https://vijos.org/p/1892 此题需要手动开栈: <<; //256MB char *p=(char*)malloc(size)+size; __asm__(" ...

  2. 【vijos】1770 大内密探(树形dp+计数)

    https://vijos.org/p/1770 不重不漏地设计状态才能正确的计数QAQ 虽然可能最优化是正确的,但是不能保证状态不相交就是作死.... 之前设的状态错了... 应该设 f[i][0] ...

  3. Vijos p1518河流 树形DP

    https://vijos.org/p/1518 这题代码我基本是抄的,实在太难想了.但是也学到了一些东西. 比如:多叉树转二叉树存,这个细细一想,确实使得在dfs的时候,实现起来方便很多. 说一说具 ...

  4. Vijos 1523 贪吃的九头龙 【树形DP】

    贪吃的九头龙 背景 安徽省芜湖市第二十七中学测试题 NOI 2002 贪吃的九头龙(dragon) Description:OfficialData:OfficialProgram:Converted ...

  5. Vijos 1144 小胖守皇宫 【树形DP】

    小胖守皇宫 描述 huyichen世子事件后,xuzhenyi成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步 ...

  6. Vijos p1770 大内密探 树形DP+计数

    4天终于做出来了,没错我就是这么蒟蒻.教训还是很多的. 建议大家以后编树形DP不要用记忆化搜索,回溯转移状态个人感觉更有条理性. 大神题解传送门 by iwtwiioi 我的题解大家可以看注释&quo ...

  7. vijos 1180 选课 树形DP

    描述 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了N(N<300)门的选修课程,每个学生可选课程的数量M是给定的.学生选修了这M门课并考核通过就能获得 ...

  8. vijos 1313 金明的预算方案 树形DP

    描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今天一 ...

  9. [vijos1892]树上的最大匹配(树形DP)

    题目:https://vijos.org/p/1892 分析:(100分其实用到各种c++优化,没什么实际意义,所以弄70就可以了) 题目很简单,很容易想出用树形DP,但是求方案数的时候,满满都是细节 ...

随机推荐

  1. 如何编写Spring-Boot自动配置

    摘要 本文主要介绍如何把一个spring的项目(特别是一些公共工具类项目),基于spring boot的自动配置的思想封装起来,使其他Spring-Boot项目引入后能够进行快速配置. AutoCon ...

  2. Android布局方式

    1. LinearLayout(线性布局)     android:orientation="vertical"    android:layout_width="wra ...

  3. python基础操作_元组_字典操作

    #元组'''元组是不可变的列表,不能改.取值和列表一样'''tp=(1,2,3)tp1=('127.0.0.1','3307')#元组只有count 和index两个方法.lis=['127.0.0. ...

  4. B树和B+树的总结

    B树 为什么要B树 磁盘中有两个机械运动的部分,分别是盘片旋转和磁臂移动.盘片旋转就是我们市面上所提到的多少转每分钟,而磁盘移动则是在盘片旋转到指定位置以后,移动磁臂后开始进行数据的读写.那么这就存在 ...

  5. node.js实现简单的登录注册页面

    首先需要新建四个文件 一个服务器js 一个保存数据的txt 一个登陆.一个注册页面html 1.注册页面 <!DOCTYPE html> <html lang="en&qu ...

  6. Ubuntu发行版升级

    从UK 13.10升级到UK 14.10 方法一: 1.sudo apt-get update   2.sudo update-manager -c -d   3.选择upgrade(升级)  方法二 ...

  7. IntelliJ IDEA:给web应用提供JSTL支持

    最近在看<Head First Servlet JSP>学习JSP,看到JSTL一章,为了添加JSTL支持折腾了好久. 网上的教程五花八门,而且多数比较旧. 我尝试了各种方法都没有成功,很 ...

  8. [USACO09MAR]地震损失2Earthquake Damage 2

    地震破坏 时间限制: 1 Sec  内存限制: 128 MB 题目描述 威斯康星发生了一场地震!约翰的牧场遭到了打击,有一些牛棚变成了废墟,如果一间牛棚遭到 了破坏,那么所有和它相连的道路都不能使用了 ...

  9. springboot(十四):springboot整合shiro-登录认证和权限管理

    这篇文章我们来学习如何使用Spring Boot集成Apache Shiro.安全应该是互联网公司的一道生命线,几乎任何的公司都会涉及到这方面的需求.在Java领域一般有Spring Security ...

  10. Kotlin入门第四课:简单工厂模式

    Kotlin基础知识的学习,请参考之前的文章: Kotlin入门第一课:从对比Java开始 Kotlin入门第二课:集合操作 Kotlin入门第三课:数据类型 初次尝试用Kotlin实现Android ...