HDU 2412 Party at Hali-Bula 树形DP
2015-07-29 18:13
411 查看
题目的意思是有一个聚会,给你一个关系树,要求上下级不能同时参加聚会,参加的最多人数是多少,如果只有一种可能,输出Yes,否则输出No。这是一道典型的树形DP,维护两个数组,一个DP数组,一个FLAG数组,DP维护的是人数,FLAG维护的是情况是否唯一。对于一个节点,我们有取或不取两种状态。如果取,则是DP[i][1],那么他的子节点就必须是不取的状态,如果不取,那么他的子节点就随意,取人数多的那种。状态转移方程是这样的:DP[i][1] += DP[j][0], DP[i][0] += max(DP[j][0],DP[j][1]);至于FLAG数组,对于一个节点,他表示情况不唯一的情况有这么几种:取得时候,子节点的情况不唯一,(也就是子节点的FLAG数组等于1);或是子节点中发现取子节点或不取子节点的人数一样(就是DP[j][0] == DP[j][1])。这两种情况。
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <map> #define maxn 200 #define mem(a, b) memset(a, b, sizeof(a)) #pragma comment(linker, "/STACK:102400000,102400000"); using namespace std; char ch[105], ch2[105]; int dp[maxn + 5][2], heads[maxn + 5], sizes, n, nn; bool flag[maxn + 5][2]; struct edge { int v, next; }eg[maxn + 5]; void inits() { mem(heads, -1); mem(dp, 0); mem(flag, 0); sizes = 0; nn = 1; return; } void add(int u, int v) { eg[sizes].v = v; eg[sizes].next = heads[u]; heads[u] = sizes++; return; } void dfs(int a) { if(heads[a] == -1) { dp[a][0] = 0; dp[a][1] = 1; return; } dp[a][1] = 1; for(int i = heads[a];i != -1;i = eg[i].next) { int v = eg[i].v; dfs(v); if(dp[v][1] > dp[v][0]) { dp[a][0] += dp[v][1]; if(flag[v][1]) flag[a][0] = 1; } else if(dp[v][1] < dp[v][0]) { dp[a][0] += dp[v][0]; if(flag[v][0]) flag[a][0] = 1; } else { dp[a][0] += dp[v][0]; flag[a][0] = 1; } dp[a][1] += dp[v][0]; if(flag[v][0]) flag[a][1] = 1; } return; } int main() { while(~scanf("%d%*c", &n)&&n) { map<string, int> mps; inits(); scanf("%s", ch); mps[ch] = nn++; for(int i = 1;i < n;i++) { scanf("%s%s", ch, ch2); if(!mps[ch]) mps[ch] = nn++; if(!mps[ch2]) mps[ch2] = nn++; add(mps[ch2], mps[ch]); } dfs(1); if(dp[1][0] == dp[1][1]) printf("%d No\n", dp[1][0]); else if(dp[1][0] > dp[1][1]) { if(flag[1][0]) printf("%d No\n", dp[1][0]); else printf("%d Yes\n", dp[1][0]); } else { if(flag[1][1]) printf("%d No\n", dp[1][1]); else printf("%d Yes\n", dp[1][1]); } } return 0; }
相关文章推荐
- git的基本使用命令操作
- sql优化原则
- ios 工程代码整理
- iOS正则表达式(三)
- 逆序对问题的两种解决策略
- SVN版本控制推荐使用方法
- Struts2 的ModelDriven 二——ModelDrive
- R语言笔记1--向量、数组、矩阵、数据框、列表
- QT 查询数据库
- FindBug:Call to static DateFormat
- JAVA基础点汇总(四)
- FindBug:Call to static DateFormat
- VC 窗口出现白屏闪烁的解决办法
- javascript深入理解js闭包
- 利用javascript实现文本的自动输出
- 前端开发面试题
- cocos2dx中的三种缓存
- python设计模式之责任链模式
- ScrollView与ListView共存代码
- 使用eclipse搭建maven多module项目