http://acm.hdu.edu.cn/showproblem.php?pid=2412

树状DP,找出树中互不相邻的点,最多能有多少个,判断是否唯一比较麻烦

不涂即为白色,黑色表示选择该点

不唯一的涂色方法可以分为以下两种树:

1.(如果根节点为白色,最多的涂色方法)dp[i][0]  有多种的树

2.(如果根节点为黑色,最多的涂色方法)dp[i][1]  有多种的树

形成1类型树方法:

如果根节点为白色,它的子树中有任意一个满足下面条件:

dp[j][0] == dp[j][1]

或 (dp[j][0] > dp[j][1] 且 该子树为1类型树)

或 (dp[j][1] > dp[j][0] 且 该子树为2类型树)

形成2类型树方法:

如果根节点为白色,它的子树中有任意一个是1类型树:

  1 #include <stdio.h>
  2 #include <iostream>
  3 #include <string>
  4 #include <vector>
  5 #include <map>
  6
  7 using namespace std;
  8
  9 vector<int> p[210];
 10 vector<int>::iterator it;
 11 int n, dp[210][2], mark[210][2];
 12
 13 void dfs(int x)
 14 {
 15     int i, j, sum1, sum2;
 16     if(p[x].empty())
 17     {
 18         dp[x][0] = 0;
 19         dp[x][1] = 1;
 20         mark[x][0] = mark[x][1] = 0;
 21         return;
 22     }
 23     sum1 = 0; //don't choose
 24     sum2 = 1; //choose
 25     for(i=0; i<p[x].size(); i++)
 26     {
 27         j = p[x][i];
 28         dfs(j);
 29         if(dp[j][1] > dp[j][0] && mark[j][1])
 30         {
 31             mark[x][0] = 1;
 32         }
 33         if(dp[j][0] > dp[j][1] && mark[j][0])
 34         {
 35             mark[x][0] = 1;
 36         }
 37         if(dp[j][0] == dp[j][1])
 38         {
 39             mark[x][0] = 1;
 40         }
 41         if(mark[j][0])
 42         {
 43             mark[x][1] = 1;
 44         }
 45         sum1 += max(dp[j][0], dp[j][1]);
 46         sum2 += dp[j][0];
 47     }
 48     dp[x][0] = sum1;
 49     dp[x][1] = sum2;
 50 }
 51
 52 int main()
 53 {
 54     string s, s1, s2;
 55     map<string, int> map1;
 56     int i, temp1, temp2;
 57     while(scanf("%d", &n), n)
 58     {
 59         for(i=1; i<=n; i++)
 60         {
 61             mark[i][0] = mark[i][1] = 0;
 62             p[i].clear();
 63         }
 64         map1.clear();
 65         cin >> s;
 66         map1.insert(make_pair(s, 1));
 67         i = 2;
 68         n = n - 1;
 69         while(n-- && cin >> s1 >> s2)
 70         {
 71             if(map1.find(s1) == map1.end())
 72             {
 73                 map1.insert(make_pair(s1, i));
 74                 i = i + 1;
 75             }
 76             if(map1.find(s2) == map1.end())
 77             {
 78                 map1.insert(make_pair(s2, i));
 79                 i = i + 1;
 80             }
 81             temp1 = map1[s1];
 82             temp2 = map1[s2];
 83             p[temp2].push_back(temp1);
 84         }
 85         dfs(1);
 86         if(dp[1][0] == dp[1][1])
 87         {
 88             printf("%d No\n", dp[1][0]);
 89             continue;
 90         }
 91         if(dp[1][0] > dp[1][1])
 92         {
 93             printf("%d ", dp[1][0]);
 94             printf(mark[1][0]? "No\n": "Yes\n");
 95             continue;
 96         }
 97         if(dp[1][0] < dp[1][1])
 98         {
 99             printf("%d ", dp[1][1]);
100             printf(mark[1][1]? "No\n": "Yes\n");
101         }
102     }
103     return 0;
104 }

转载于:https://www.cnblogs.com/yuan1991/archive/2013/03/26/hdu2412.html

hdu2412 Party at Hali-Bula相关推荐

  1. Hali硬件安全工具-串口通讯RS232/485/422/CAN抓包

    1.场景需求 我发现我的CSDN的优点之一就是,每篇文章都有讲清楚起因,平白无故的技术学习是没有根的,没有落地的场景,没有技术的应用,技术本身就是昙花一现. 这次的分享,是Hali硬件安全工具的第一次 ...

  2. nginx配置文件基本配置

    前言 淘宝项目贼大,可以放在tomcat里打一个几个G的war包.启动完,内存就没空余了.Client访问多了就控制不住了.这时候怎么办? 模块化!搜索.推荐.用户管理.订单系统-都分别成立项目组专门 ...

  3. Android UncaughtExceptionHandler 全局异常监控

    2019独角兽企业重金招聘Python工程师标准>>> 一.全局捕获异常 为了解决这样的问题,我们需要能够及时的捕获异常,但要捕获的地方是在太多,因此,我们需要进行全局性的异常捕获, ...

  4. HttpClient的简单使用

    目录 HttpClient的使用 一.maven坐标 二. 主要API 2.1 CloseableHttpClient 2.2 HttpClients 2.3 URIBuilder 2.4 HttpG ...

  5. CTAssetsPickerController 选中图片不显示对号的问题解决

    转载自:http://blog.csdn.net/qq_27304667/article/details/53218547 早上AppStore审核通过,下载来看看.突然发现一个选择图片时候选中的标识 ...

  6. 【codecombat】 试玩全攻略 第十四关 已知敌人

    第十四关 已知敌人 在这一关里,我们的英雄获得了一副可以看见敌人的眼镜,所以他很强势的学会了"发现敌人"的技能. hero.findNearestEnemy()命令,单词多了,首字 ...

  7. 一个excel文档里复制黏贴另外表单跟着变动_利用Excel连接Power BI,实现PPT报告自动输出...

    ​文/HALI就职于汽车行业战略部门 专注汽车市场信息情报收集和分析 因为工作需要,每月周期性的更新数据和撰写PPT 报告成为繁重的劳动.结果是很多时间花费在数据处理上,真正的分析工作,往往只能草草收 ...

  8. 设计模式记--Observer Pattern观察者模式

    观察者模式--定义了对象之间的一对多依赖,这样一来,当一个对像改变状态时,它的所有依赖者都会收到通知并自动更新.   从定义可以看出,OBSERVER(观察者)模式逻辑上需要两组对象来实现.首先它必需 ...

  9. poj 3680 Intervals

    给定N个带权的开区间,第i个区间覆盖区间(ai,bi),权值为wi.现在要求挑出一些区间使得总权值最大,并且满足实轴上任意一个点被覆盖不超过K次. 1<=K<=N<=200.1< ...

最新文章

  1. 多线程编程有什么用途_C++ 多线程编程 (一)
  2. 设计模式之命令模式、举例分析、通俗易懂
  3. MIT出品2017-2018深度学习最新进展汇总
  4. decimal类型保留两位小数
  5. 在网易有道做语音算法工程师是一种怎样的体验?
  6. Web服务器性能估算
  7. C#调用mciSendString播放音频文件
  8. Cow Contest(POJ-3660 )
  9. Codeforces 853C - Boredom
  10. 如何使用自动化与分析工具库创建 Excel 直方图
  11. [SRM] 09 撕书狂魔CZL
  12. 基于微信小程序的点餐系统源码【包调试运行】
  13. CAN bus 基础知识
  14. 帝国CMS Table '***.phome_ecms_news_data_' doesn't exist
  15. java 9宫格抽奖_九宫格抽奖
  16. MATLAB 基础与通信系统仿真
  17. delphi Base64 编解码
  18. 微信小程序经纬度获取地图导航(导航接入第三方)
  19. [译] 流量控制(TC)五十年:从基于缓冲队列(Queue)到基于时间戳(EDT)的演进...
  20. conda删除虚拟环境

热门文章

  1. 今天发现了VISTA系统的一个BUG
  2. [Redis]Redis章2 Redis 持久化
  3. 最好用的在线思维导图软件
  4. [Markdown] 数学公式
  5. MySQL基本语句与数据类型
  6. import的几种用法
  7. Java小故事(一)
  8. 【讀書筆記】人人都是产品经理
  9. EF +MYSQL 配置
  10. dev c++ 最新版本5.0