POJ 2342 (树形DP)
题目链接: 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)相关推荐
- poj 2342 树形DP
树形DP入门题目. 树形DP说白了就是在搜索的时候动态规划. 只要你懂的深搜+动态规划,就能理解这个基础题了. 先直接搜索到最底层,然后一层一层动态规划,可以说有点像数塔. dp[i][1],dp[i ...
- Fire (poj 2152 树形dp)
Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000).现在要选择某些点,使得整棵树都被覆盖到.当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同 ...
- POJ 3342 树形DP+Hash
这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...
- poj 2486 树形dp
思路:这题是裸的树形dp.dp[i][j]表示第i个节点花费j步并且从子节点返回,能得到的最大苹果数:nback[i[j]表示第i个节点花费j步并且进入某个子节点不返回,能得到的最大苹果数.那么我们就 ...
- poj 2152 树形dp(建立消防站)
题意:给定n个节点组成的树,树边有权.现在要在一些点上建立消防站,每个点建站都有花费cost[i].如果某点上没有消防站,那么在距离它d[i]之内的某个点上必须有消防站.求符合上述条件的最小费用建站方 ...
- poj 1947(树形dp+背包问题)
题大意是:给你一棵节点为n的树,问至少砍几刀可以孤立出一棵节点为m的子树. 解题思路:这题很容易想到状态dp[i][j]表示以i节点为根,节点总数为j的子树最少需要切几刀.但是这个状态方程确实很难想, ...
- poj 3417 树形dp+LCA
思路:我以前一直喜欢用根号n分段的LCA.在这题上挂了,第一次发现这样的LCA被卡.果断改用Tarjan离线算法求LCA. 当前节点为u,其子节点为v.那么: 当以v根的子树中含有连接子树以外点的边数 ...
- poj 2057 树形DP,数学期望
题目链接:http://poj.org/problem?id=2057 题意:有一只蜗牛爬上树睡着之后从树上掉下来,发现后面的"房子"却丢在了树上面, 现在这只蜗牛要求寻找它的房子 ...
- |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要 ...
最新文章
- MySQL与MongoDB之SQL语法对比
- vi 搜索命令_vi或vim如何查询关键字
- c语言考试题及答案 大一,大一C语言期末考试试题
- Java Message System简介
- 如何制作自动更新程序?
- 第五部分 自定义的Calendar接口示例
- centos7安装docker-ce新版
- CCF201612-1 中间数
- git(1)---git介绍
- mpls 跨域 optionA 配置实例
- 改造MFC程序,使原来不支持winsocket的工程支持winsocket
- BZOJ2190 [SDOI2008]仪仗队
- 30个python常用代码大全_30 个 Python 常用极简代码,拿走就用
- matlab计算器设计流程图_matlab计算器设计
- C语言骑士与金币问题
- nginx 配置443端口
- 《孤独的青春创造不孤独的人生》
- 阿里云盘内测邀请码是多少?阿里云盘邀请码获得方法
- vuejs2.0 数组操作 提示Cannot read property 'push' of undefined
- 基于Rebound制造绚丽的动画效果-入门篇
热门文章
- AI最后--热门游戏引擎(CN地区)
- system(“”start calc“”)
- docker入门,基于ubuntu16.04
- iWiscloud智慧家居控制中心
- springmvc配置同时支持html和jspl两种格式的页面
- 关于mysql启动错误
- Shell编程中Shift的用法(转)
- POJ 1861 Network
- Exception.InnerException 属性的使用
- Caused by: java.lang.IncompatibleClassChangeError: Implementing class