今天开始做老师给的专辑,打开DP专辑 A题 Rebuilding Roads 直接不会了,发现是树形DP,百度了下了该题,看了老半天看不懂,想死的冲动都有了~~~~

最后百度了下,树形DP入门,找到了 poj 2342 Anniversary party   先入门一下~

题意:

某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上司,现在已知每个人的活跃指数和上司关系(当然不可能存在环),求邀请哪些人(多少人)来能使得晚会的总活跃指数最大。

思路:

任何一个点的取舍可以看作一种决策,那么状态就是在某个点取的时候或者不取的时候,以他为根的子树能有的最大活跃总值。分别可以用f[i,1]和f[i,0]表示第i个人来和不来。

当i来的时候,dp[i][1] += dp[j][0];//j为i的下属

当i不来的时候,dp[i][0] +=max(dp[j][1],dp[j][0]);//j为i的下属

以下代码参考:http://hi.baidu.com/saintlleo/blog/item/0606b3feb7026ad3b48f3111.html

//AC CODE:

    1. #include<cmath>
    2. #include<algorithm>
    3. #include<vector>
    4. #include<cstdio>
    5. #include<cstdlib>
    6. #include<cstring>
    7. #include<string>
    8. using namespace std;
    9. #define maxn 6005
    10. int n;
    11. int dp[maxn][2],father[maxn];//dp[i][0]0表示不去,dp[i][1]1表示去了
    12. bool visited[maxn];
    13. void tree_dp(int node)
    14. {
    15. int i;
    16. visited[node] = 1;
    17. for(i=1; i<=n; i++)
    18. {
    19. if(!visited[i]&&father[i] == node)//i为下属
    20. {
    21. tree_dp(i);//递归调用孩子结点,从叶子结点开始dp
    22. //关键
    23. dp[node][1] += dp[i][0];//上司来,下属不来
    24. dp[node][0] +=max(dp[i][1],dp[i][0]);//上司不来,下属来、不来
    25. }
    26. }
    27. }
    28. int main()
    29. {
    30. int i;
    31. int f,c,root;
    32. while(scanf("%d",&n)!=EOF)
    33. {
    34. memset(dp,0,sizeof(dp));
    35. memset(father,0,sizeof(father));
    36. memset(visited,0,sizeof(visited));
    37. for(i=1; i<=n; i++)
    38. {
    39. scanf("%d",&dp[i][1]);
    40. }
    41. root = 0;//记录父结点
    42. bool beg = 1;
    43. while (scanf("%d %d",&c,&f),c||f)
    44. {
    45. father[c] = f;
    46. if( root == c || beg )
    47. {
    48. root = f;
    49. }
    50. }
    51. while(father[root])//查找父结点
    52. root=father[root];
    53. tree_dp(root);
    54. int imax=max(dp[root][0],dp[root][1]);
    55. printf("%d\n",imax);
    56. }
    57. return 0;
    58. }

DP Intro - poj 2342 Anniversary party的更多相关文章

  1. DP Intro - Tree POJ2342 Anniversary party

    POJ 2342 Anniversary party (树形dp 入门题) Anniversary party Time Limit: 1000MS   Memory Limit: 65536K To ...

  2. POJ 2342 Anniversary party / HDU 1520 Anniversary party / URAL 1039 Anniversary party(树型动态规划)

    POJ 2342 Anniversary party / HDU 1520 Anniversary party / URAL 1039 Anniversary party(树型动态规划) Descri ...

  3. POJ 2342 - Anniversary party - [树形DP]

    题目链接:http://poj.org/problem?id=2342 Description There is going to be a party to celebrate the 80-th ...

  4. POJ 2342 Anniversary party (树dp)

    题目链接:http://poj.org/problem?id=2342 有n个人,每个人有活跃值.下面n-1行u和v表示u的上司是v,有直接上司和下属的关系不能同时参加party,问你party最大的 ...

  5. poj 2342 Anniversary party 树形DP入门

    题目链接:http://poj.org/problem?id=2342 题意:一家公司有1 <= N <= 6 000个职工,现要组织一些职工参加晚会,要求每个职工和其顶头上司不能同时参加 ...

  6. POJ 2342 Anniversary party 树形DP基础题

    题目链接:http://poj.org/problem?id=2342 题目大意:在一个公司中,每个职员有一个快乐值ai,现在要开一个party,邀请了一个员工就不可能邀请其直属上司,同理邀请了一个人 ...

  7. POJ 2342 Anniversary party(树形dp)

    Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7230   Accepted: 4162 ...

  8. poj 2342 Anniversary party 简单树形dp

    Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3862   Accepted: 2171 ...

  9. [ACM] POJ 2342 Anniversary party (树DP获得冠军)

    Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4410   Accepted: 2496 ...

随机推荐

  1. Discuz核心函数的解析

    dz采用的是多入口的方式,在每个入口函数你能看到引用,启动核心类的语句(其余省略),如下: require './source/class/class_core.php'; C::app()-> ...

  2. unittest测试框架详谈及实操(三)

    断言 unittest的TestCase类提供了很多实用的方法来校验预期结果和程序返回的实际结果是否一致.当然这些方法要求必须满足某些条件才能继续执行接下的测试.大致有3种这样的方法.各覆盖一个特定类 ...

  3. 关于Markdown格式转PDF格式

    Markdown转PDF格式 个人使用的Markdown编辑平台:有道云笔记网页版 当我们编辑好自己的随笔以后,在网页的[客户端下载]下面有一个[更多]的圆形图标选项,点击后在菜单中有一处[打印]选项 ...

  4. Memcache+Cookie替代Session解决方案(MVC版)

    阅读目录 开始 通过IHttpModule注册过滤管道方式 通过BaseController 关于滑动过期 两种方式 回到顶部 通过IHttpModule注册过滤管道方式 具体实现如下: 声明一个类C ...

  5. Linux 判断进程是否已经运行的程序

    bool ServerProcess::isAlreadyRunning() { #ifndef __linux__ WarningLog(<<"can't check if p ...

  6. 一类适合初学者的DP:最大子段和与最大子矩阵

    最近在水简单DP题,遇到了两道层层递进的DP题,于是记录一下 一.最大子段和 题意: 给出一个长度为n(n<=1e5)的序列,求连续子段的最大值 比如说2 3 -4 5 的最大值是6  而 2 ...

  7. git 恢复被修改的文件

    恢复到最后一次提交的改动:   git checkout filename 如果该文件已经 add 到暂存队列中,恢复文件:   git reset HEAD filename

  8. Mac安装Tomcat

    1. 到Tomcat官网下载,如下找tar格式文件: http://ftp.twaren.net/Unix/Web/apache/tomcat/tomcat-8/v8.0.41/bin/apache- ...

  9. JFrog Artifactory

    是一款二进制存储管理工具,用来管理构建构建工具(如:gradle.maven.nuget.docker等等)等所依赖的二进制仓库,以方便管理第三方库和发布目标版本库,从而提高软件开发效率. 为DevO ...

  10. python基本算法

    算法优劣评判标准 时间复杂度: 定义:用来评估算法运行效率的一个式子 print('Hello World') O(1) for i in range(n): print('Hello World') ...