写了两种DP,第一种是按照自己习惯来xjb敲的,第二种参考别人

熟悉一下树形DP的套路

dp[i][]是维护i及以下的关系最优值的,所以我觉得两次DP记忆搜索之间不清-1应该是正确的(也就做了一次加法)

  1. #include<bits/stdc++.h>
  2. #define rep(i,j,k) for(register int i=j;i<=k;i++)
  3. #define rrep(i,j,k) for(register int i=j;i>=k;i--)
  4. using namespace std;
  5. typedef long long ll;
  6. const int maxn = 2e5+11;
  7. int dp[maxn][2];
  8. int w[maxn];
  9. bool flag[maxn];
  10. int to[maxn<<1],nxt[maxn<<1],head[maxn],tot;
  11. void init(){memset(head,-1,sizeof head);tot=0;}
  12. void add(int u,int v){
  13. to[tot]=v;nxt[tot]=head[u];
  14. head[u]=tot++;
  15. }
  16. int DP(int u,int now){
  17. if(~dp[u][now]) return dp[u][now];
  18. int ans=now?w[u]:0;
  19. for(int i = head[u]; ~i; i = nxt[i]){
  20. int v=to[i];
  21. if(now==0) ans+=max(max(DP(v,now),DP(v,now^1)),0);
  22. else ans+=max(0,DP(v,now^1));
  23. }
  24. return dp[u][now]=ans;
  25. }
  26. int DP(int u){
  27. dp[u][0]=0;
  28. dp[u][1]=w[u];
  29. for(int i = head[u]; ~i; i = nxt[i]){
  30. int v=to[i];
  31. DP(v);
  32. dp[u][0]+=max(dp[v][0],dp[v][1]);
  33. dp[u][1]+=dp[v][0];
  34. }
  35. return max(dp[u][0],dp[u][1]);
  36. }
  37. int main(){
  38. int n,u,v,rt;
  39. while(scanf("%d",&n)!=EOF){
  40. init();memset(flag,0,sizeof flag);
  41. rep(i,1,n) scanf("%d",&w[i]);
  42. while(scanf("%d%d",&u,&v)!=EOF){
  43. if(u*v==0)break;
  44. add(v,u);flag[u]=1;
  45. }
  46. rep(i,1,n) if(!flag[i]){
  47. rt=i;
  48. break;
  49. }
  50. memset(dp,-1,sizeof dp);
  51. printf("%d\n",max(DP(rt,0),DP(rt,1)));
  52. }
  53. return 0;
  54. }

HDU - 1520 树形DP入门题的更多相关文章

  1. HDU 1520 树形DP入门

    HDU 1520 [题目链接]HDU 1520 [题目类型]树形DP &题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上司,现在已知 ...

  2. HDU 1520 树形dp裸题

    1.HDU 1520  Anniversary party 2.总结:第一道树形dp,有点纠结 题意:公司聚会,员工与直接上司不能同时来,求最大权值和 #include<iostream> ...

  3. (树形DP入门题)Anniversary party(没有上司的舞会) HDU - 1520

    题意: 有个公司要举行一场晚会.为了让到会的每个人不受他的直接上司约束而能玩得开心,公司领导决定:如果邀请了某个人,那么一定不会再邀请他的直接的上司,但该人的上司的上司,上司的上司的上司等都可以邀请. ...

  4. POJ 2342 树形DP入门题

    有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...

  5. hdu_Anniversary party_(树形DP入门题)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意:有N个人,N-1个人有自己的上司,每个人有一个快乐值,如果这个人参加了聚会,那么这个人的直 ...

  6. HDU 1561 树形DP入门

    The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  7. codevs 1380/HDU 1520 树形dp

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

  8. hdu 1520 (树形DP)

    dp[i][0]表示i不参加 dp[i][1]表示i参加 简单的树形dp #include<stdio.h> #include<string.h> #define N 6100 ...

  9. hdu 1520 树形DP基础

    http://acm.hdu.edu.cn/showproblem.php?pid=1520 父节点和子节点不能同时选. http://blog.csdn.net/woshi250hua/articl ...

随机推荐

  1. Centos里没有lsb_release

    查看Centos操作系统版本,输入指令 lsb_release -a 报无此命令 解决办法,安装lsb_release 1.执行指令:yum install -y redhat-lsb 2.安装完毕后 ...

  2. Cunit编译安装

    1.  Examples/Makefile.am:26: to 'configure.ac' and run 'autoconf' again. configure.ac:211: error: re ...

  3. 写一段php代码,确保报个进程同时写入同一个文件

  4. ls -al

    ls -al:显示当前文件下所有的文件

  5. 通达OA整合教程

      资源下载地址: 通达OA 2015:http://pan.baidu.com/s/1qYMxsZU mysql下载:http://pan.baidu.com/s/1c2oVI5y 整合文件:htt ...

  6. 编写高质量代码改善C#程序的157个建议——建议54:为无用字段标注不可序列化

    建议54:为无用字段标注不可序列化 序列化是指这样一种技术:把对象转变成流.相反过程,我们称为反序列化.在很多场合都需要用到这项技术. 把对象保存到本地,在下次运行程序的时候,恢复这个对象. 把对象传 ...

  7. Python实现wc.exe

    github传送门 项目相关要求 基本功能 -c file.c 返回文件file.c的字符数 (实现) -w file.c 返回文件file.c的词的数目(实现) -l file.c 返回文件file ...

  8. 类的 where T : class 泛型类型约束

    where T : struct | T必须是一个结构类型where T : class T必须是一个类(class)类型where T : new() | T必须要有一个无参构造函数where T ...

  9. 【C#】is 和 as

    看个例子: public class User { } public class Group { } class Program { static void Main(string[] args) { ...

  10. java8之流的基本使用(二)

    概述 流(stream())是java8的一个新特性,主要的作用就是将各种类型的集合转换为流,然后的方便迭代数据用的.例如: //将List类型的集合转换为流 list.stream() 转换为流之后 ...