Party at Hali-Bula

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1365    Accepted Submission(s): 454

Problem Description
Dear Contestant,

I'm going to have a party at my villa at Hali-Bula to celebrate my retirement from BCM. I wish I could invite all my co-workers, but imagine how an employee can enjoy a party when he finds his boss among the guests! So, I decide not to invite both an employee and his/her boss. The organizational hierarchy at BCM is such that nobody has more than one boss, and there is one and only one employee with no boss at all (the Big Boss)! Can I ask you to please write a program to determine the maximum number of guests so that no employee is invited when his/her boss is invited too? I've attached the list of employees and the organizational hierarchy of BCM.

Best,
--Brian Bennett

P.S. I would be very grateful if your program can indicate whether the list of people is uniquely determined if I choose to invite the maximum number of guests with that condition.

 
Input
The input consists of multiple test cases. Each test case is started with a line containing an integer n (1 ≤ n ≤ 200), the number of BCM employees. The next line contains the name of the Big Boss only. Each of the following n-1 lines contains the name of an employee together with the name of his/her boss. All names are strings of at least one and at most 100 letters and are separated by blanks. The last line of each test case contains a single 0.
 
Output
For each test case, write a single line containing a number indicating the maximum number of guests that can be invited according to the required condition, and a word Yes or No, depending on whether the list of guests is unique in that case.
 
Sample Input
6
Jason
Jack Jason
Joe Jack
Jill Jason
John Jack
Jim Jill
2
Ming
Cho Ming
0
Sample Output
4 Yes
1 No
 
Source
 
题意:有个人想请客,但是由于要请的人之间存在上司和下属的关系,为了能避免下属和直接上司一起,寻找一个合理的方案。
         求最大的请客人数,上司和下属满足一棵树。
 
思路:如何处理字符串,转化成一棵树? 由于根节点已经知道,所以通过统计i点有多少个子节点就可以了。
        通过搜索来求取,关键是状态转移怎么写。
   dp[ i ] [ 0 ] 代表不包含第 i 个节点时的 最大人数目。
   dp[ i ] [ 1 ] 代表   包含第 i 个节点时到 最大人数目。
        那么对于叶子节点
        dp[ i ] [ 0 ]=0; dp[ i ] [ 1]=1;
        对于非叶子节点,
        dp[ i ] [ 0 ]= sum{   Max(dp[ j ] [ 0 ], dp[ j ] [ 1 ]  }; 其中dp[ j ] [ 0 ]的 j 是 i 的子节点。
        dp[ i ] [ 1 ]= sum{   dp[ j ] [ 0 ] } + 1 ;
  //画图试一试就知道了。
 
        对于统计是否唯一,另设一个数组ndp[ i ] [ j ]
    对于叶子节点:
          ndp[ i ] [ 0 ]=1; 代表不包含第 i 点的时候,全部子节点的种类是 唯一 的。
          ndp[ i ] [ 0 ]=0; 代表不包含第 i 点的时候,全部子节的的种类是  不唯一的。
 
          ndp[ i ] [ 1 ]=0; 代表  包含第  i 点的时候,全部子节点的种类是  不唯一。
          ndp[ i ] [ 1 ]=1;反之。
 
        非叶子节点:
    1.( dp[ k ] [ 0 ]> dp[ k ] [ 1 ] && ndp[ k ][ 0 ]==0)
        2.( dp[ k ] [ 1 ]> dp[ k ] [ 0 ] && ndp[ k ][ 1 ]==0)
        3.dp[ k ] [ 1 ] = = dp[ k ] [ 0 ];
       1或2或3满足 ,则 ndp[ k ] [ 0 ]= 0; why???要看看dp[ K ] [ 0 ];就知道了。
 
        如果存在子节点 满足 ndp[ j ] [ 0 ]==0 则 ndp[ k ] [ 0 ]=0; //j代表是 K 的子节点。
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std; struct node
{
int next[];
int num;
}f[];
char cur[][];
int len;
bool glag,flag;
int dp[][];
int ndp[][]; int Max(int x,int y)
{
return x>y? x:y;
} int serch(char a[])
{
int i;
for(i=;i<=len;i++)
{
if(strcmp(a,cur[i])==)
return i;
}
strcpy(cur[++len],a);
return len;
} void dfs(int k)
{
int i,q,cur=;
if(f[k].num==)
{
dp[k][]=;
dp[k][]=;
ndp[k][]=;
ndp[k][]=;
return;
}
for(i=;i<=f[k].num;i++)
{
q=f[k].next[i];
dfs(q);
cur=Max(dp[q][],dp[q][]);
dp[k][]+=cur;
dp[k][]+=dp[q][]; if(dp[q][]>dp[q][]&&ndp[q][]==)
ndp[k][]=;
if(dp[q][]>dp[q][]&&ndp[q][]==)
ndp[k][]=;
if(dp[q][]==dp[q][]) ndp[k][]=; if(ndp[q][]==) ndp[k][]=;
}
dp[k][]++;
if(ndp[k][]==-) ndp[k][]=;
if(ndp[k][]==-) ndp[k][]=;
} int main()
{
int i,n,ans1,ans2;
char a[],b[];
while(scanf("%d",&n)>)
{
if(n==)break;
for(i=;i<=;i++) f[i].num=;
scanf("%s",cur[]);
len=;
for(i=;i<n;i++)
{
scanf("%s%s",a,b);
ans1=serch(a);
ans2=serch(b); f[ans2].num++;
f[ans2].next[f[ans2].num]=ans1; }
memset(dp,,sizeof(dp));
memset(ndp,-,sizeof(ndp));
glag=false;flag=false;
dfs(); if(dp[][]>dp[][]&&ndp[][]==)
printf("%d Yes\n",dp[][]);
else if(dp[][]>dp[][]&&ndp[][]==)
printf("%d Yes\n",dp[][]);
else printf("%d No\n",Max(dp[][],dp[][]));
}
return ;
}

hdu 2412 Party at Hali-Bula 经典树形DP的更多相关文章

  1. HDU 1561 The more, The Better 经典树形DP

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

  2. HDU 4126 Genghis Khan the Conqueror 最小生成树+树形dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4126 Genghis Khan the Conqueror Time Limit: 10000/50 ...

  3. hdu 5909 Tree Cutting——点分治(树形DP转为序列DP)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5909 点分治的话,每次要做一次树形DP:但时间应该是 siz*m2 的.可以用 FWT 变成 siz*ml ...

  4. hdu 1520 Anniversary party(第一道树形dp)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Time Limit: 2000/1000 MS (Java ...

  5. bzoj 2159 Crash 的文明世界 && hdu 4625 JZPTREE ——第二类斯特林数+树形DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2159 学习材料:https://blog.csdn.net/litble/article/d ...

  6. bzoj 2159 Crash 的文明世界 & hdu 4625 JZPTREE —— 第二类斯特林数+树形DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2159 使用公式:\( n^{k} = \sum\limits_{i=0}^{k} S(k,i ...

  7. HDU 4003 Find Metal Mineral(分组背包+树形DP)

    题目链接 很棒的一个树形DP.学的太渣了. #include <cstdio> #include <string> #include <cstring> #incl ...

  8. 【HDU - 4340】Capturing a country(树形DP)

    BUPT2017 wintertraining(15) #8A 题意 n(<100)个城市组成的树.A攻击i城市需要a[i]代价,B需要b[i].如果一个城市的邻居被A攻击了,那么A攻击它只要A ...

  9. hdu 3660 Alice and Bob's Trip(树形DP)

    Alice and Bob's Trip Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  10. HDU 1561 The more, The Better【树形DP/有依赖的分组背包】

    ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物.但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先 ...

随机推荐

  1. Vulnhub Breach1.0

    1.靶机信息 下载链接 https://download.vulnhub.com/breach/Breach-1.0.zip 靶机说明 Breach1.0是一个难度为初级到中级的BooT2Root/C ...

  2. React 初识

    React We built React to solve one problem: building large applications with data that changes over t ...

  3. 1.2 Percona XtraDB Cluster Limitations

    摘要: 出处:黑洞中的奇点 的博客 http://www.cnblogs.com/kelvin19840813/ 您的支持是对博主最大的鼓励,感谢您的认真阅读.本文版权归作者所有,欢迎转载,但请保留该 ...

  4. 40.oracle事务

    一.事务特性 事务必须具备以下四个特性,简称ACID属性 原子性(Atomicity):事务是一个完整的操作.事务的各步操作是不可分割的(原子的):要么都执行,要么都不执行场景:银行转账 A-100 ...

  5. 介绍&代码

    之前参考前辈实现的分页组件,还ok. 介绍: 基于Web,实现分页样式 和 控制页面内容数据的展示形式. 实现: from django.utils.safestring import mark_sa ...

  6. xilinx DMA IP核(一) —— loop测试 代码注释

    本篇笔记中的代码来自:米联科技的教程“第三季第一篇的DMA_LOOP环路测试” 硬件的连接如下图所示: 图:DMA Loop Block Design 橘色的线就是DMA加FIFO组成的一个LOOP循 ...

  7. RocketMQ学习笔记(一)eclipse版的quickstart

    学而时习之,不亦说乎! 自己搭建个学习用的RocketMQ总是很麻烦,需要虚拟机环境,网络,需要安装rocketmq,启动.时间久了再去看,又不知道这个虚拟机是干嘛的了. 直接在eclipse中启动, ...

  8. java transient 和Volatile关键字

    Volatile修饰的成员变量在每次被线程访问时,都强迫从主内存中重读该成员变量的值.而且,当成员变量发生变化时,强迫线程将变化值回写到主内存.这样在任何时刻,两个不同的线程总是看到某个成员变量的同一 ...

  9. elastic-job动态添加定时任务

    在elastic-job的使用过程中,我们会遇到动态添加定时任务的时候,但是官网上面并没有对这块内容进行说明.按照我的理解以及官网上面elastic-job的框架图,ej的定时任务其实是存储在zook ...

  10. 16.Generator函数的语法

    1.简介 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同. 执行 Generator 函数会返回一个遍历器对象,也就是说,Generator 函数除了状态机 ...