题目链接: http://poj.org/problem?id=2342

题目大意:直属上司和下属出席聚会。下属的上司出现了,下属就不能参加,反之下属参加。注意上司只是指直属的上司。每个人出席的人都有一个快乐值,问最大的快乐值是多少。

解题思路

首先确定一下顶头上司是谁。

f[v]=u表示u是v的父亲,这样addedge完了之后,从1开始while(f[root]) root=f[root],最后root就是顶头上司,也就是dfs的起点了。

用dp[i][0]表示对于第i个人不出席的最大快乐值,用dp[i][1]表示出席的最大快乐值。

则dp[i][0]=dp[i][0]+max(dp[son][0],dp[son][1]) ,原因是上司不出席,下属可出席也可不出席,取个大的。

dp[i][1]=dp[i][1]+dp[son][0],原因是上司一旦出席,下属绝对不能出席。

其中dp[i][1]的初始值为这个人的快乐值。

则ans=max(dp[root][0],dp[root][1])

注意本题的dfs只是起到推进树结构作用,推完树结构之后,还是传统的DP转移方式,不是记忆化搜索。

#include "cstdio"
#include "vector"
#include "cstring"
using namespace std;
#define maxn 6005
int hap[maxn],f[maxn],dp[maxn][2],head[maxn],tol;
struct Edge
{int to,next;
}e[maxn];
void addedge(int u,int v)
{e[tol].to=v;e[tol].next=head[u];head[u]=tol++;
}
void dfs(int root)
{dp[root][1]=hap[root];for(int i=head[root];i!=-1;i=e[i].next) dfs(e[i].to);for(int i=head[root];i!=-1;i=e[i].next){dp[root][0]+=max(dp[e[i].to][1],dp[e[i].to][0]);dp[root][1]+=dp[e[i].to][0];}
}
int main()
{//freopen("in.txt","r",stdin);int n,u,v;while(~scanf("%d",&n)&&n){memset(f,0,sizeof(f));memset(dp,0,sizeof(dp));memset(head,-1,sizeof(head));for(int i=1; i<=n; i++) scanf("%d",&hap[i]);for(int i=1; i<=n; i++){scanf("%d%d",&v,&u);if(u==0&&v==0) break;f[v]=u;addedge(u,v);}int root=1;tol=0;while(f[root]) root=f[root];dfs(root);int res=max(dp[root][0],dp[root][1]);printf("%d\n",res);}
}

13547096 neopenx 2342 Accepted 408K 0MS C++ 1182B 2014-10-20 12:18:43

POJ 2342 (树形DP)相关推荐

  1. poj 2342 树形DP

    树形DP入门题目. 树形DP说白了就是在搜索的时候动态规划. 只要你懂的深搜+动态规划,就能理解这个基础题了. 先直接搜索到最底层,然后一层一层动态规划,可以说有点像数塔. dp[i][1],dp[i ...

  2. Fire (poj 2152 树形dp)

    Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000).现在要选择某些点,使得整棵树都被覆盖到.当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同 ...

  3. POJ 3342 树形DP+Hash

    这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...

  4. poj 2486 树形dp

    思路:这题是裸的树形dp.dp[i][j]表示第i个节点花费j步并且从子节点返回,能得到的最大苹果数:nback[i[j]表示第i个节点花费j步并且进入某个子节点不返回,能得到的最大苹果数.那么我们就 ...

  5. poj 2152 树形dp(建立消防站)

    题意:给定n个节点组成的树,树边有权.现在要在一些点上建立消防站,每个点建站都有花费cost[i].如果某点上没有消防站,那么在距离它d[i]之内的某个点上必须有消防站.求符合上述条件的最小费用建站方 ...

  6. poj 1947(树形dp+背包问题)

    题大意是:给你一棵节点为n的树,问至少砍几刀可以孤立出一棵节点为m的子树. 解题思路:这题很容易想到状态dp[i][j]表示以i节点为根,节点总数为j的子树最少需要切几刀.但是这个状态方程确实很难想, ...

  7. poj 3417 树形dp+LCA

    思路:我以前一直喜欢用根号n分段的LCA.在这题上挂了,第一次发现这样的LCA被卡.果断改用Tarjan离线算法求LCA. 当前节点为u,其子节点为v.那么: 当以v根的子树中含有连接子树以外点的边数 ...

  8. poj 2057 树形DP,数学期望

    题目链接:http://poj.org/problem?id=2057 题意:有一只蜗牛爬上树睡着之后从树上掉下来,发现后面的"房子"却丢在了树上面, 现在这只蜗牛要求寻找它的房子 ...

  9. |POJ 2342|动态规划|Anniversary party

    http://poj.org/problem?id=2342 树形DP基础题,具体看注释. 设状态f[i][0]为i不来,f[i][1]为i要来 f[r][1] +=  f[i][0];   //r要 ...

最新文章

  1. MySQL与MongoDB之SQL语法对比
  2. vi 搜索命令_vi或vim如何查询关键字
  3. c语言考试题及答案 大一,大一C语言期末考试试题
  4. Java Message System简介
  5. 如何制作自动更新程序?
  6. 第五部分 自定义的Calendar接口示例
  7. centos7安装docker-ce新版
  8. CCF201612-1 中间数
  9. git(1)---git介绍
  10. mpls 跨域 optionA 配置实例
  11. 改造MFC程序,使原来不支持winsocket的工程支持winsocket
  12. BZOJ2190 [SDOI2008]仪仗队
  13. 30个python常用代码大全_30 个 Python 常用极简代码,拿走就用
  14. matlab计算器设计流程图_matlab计算器设计
  15. C语言骑士与金币问题
  16. nginx 配置443端口
  17. 《孤独的青春创造不孤独的人生》
  18. 阿里云盘内测邀请码是多少?阿里云盘邀请码获得方法
  19. vuejs2.0 数组操作 提示Cannot read property 'push' of undefined
  20. 基于Rebound制造绚丽的动画效果-入门篇

热门文章

  1. AI最后--热门游戏引擎(CN地区)
  2. system(“”start calc“”)
  3. docker入门,基于ubuntu16.04
  4. iWiscloud智慧家居控制中心
  5. springmvc配置同时支持html和jspl两种格式的页面
  6. 关于mysql启动错误
  7. Shell编程中Shift的用法(转)
  8. POJ 1861 Network
  9. Exception.InnerException 属性的使用
  10. Caused by: java.lang.IncompatibleClassChangeError: Implementing class