hdu2412 Party at Hali-Bula
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相关推荐
- Hali硬件安全工具-串口通讯RS232/485/422/CAN抓包
1.场景需求 我发现我的CSDN的优点之一就是,每篇文章都有讲清楚起因,平白无故的技术学习是没有根的,没有落地的场景,没有技术的应用,技术本身就是昙花一现. 这次的分享,是Hali硬件安全工具的第一次 ...
- nginx配置文件基本配置
前言 淘宝项目贼大,可以放在tomcat里打一个几个G的war包.启动完,内存就没空余了.Client访问多了就控制不住了.这时候怎么办? 模块化!搜索.推荐.用户管理.订单系统-都分别成立项目组专门 ...
- Android UncaughtExceptionHandler 全局异常监控
2019独角兽企业重金招聘Python工程师标准>>> 一.全局捕获异常 为了解决这样的问题,我们需要能够及时的捕获异常,但要捕获的地方是在太多,因此,我们需要进行全局性的异常捕获, ...
- HttpClient的简单使用
目录 HttpClient的使用 一.maven坐标 二. 主要API 2.1 CloseableHttpClient 2.2 HttpClients 2.3 URIBuilder 2.4 HttpG ...
- CTAssetsPickerController 选中图片不显示对号的问题解决
转载自:http://blog.csdn.net/qq_27304667/article/details/53218547 早上AppStore审核通过,下载来看看.突然发现一个选择图片时候选中的标识 ...
- 【codecombat】 试玩全攻略 第十四关 已知敌人
第十四关 已知敌人 在这一关里,我们的英雄获得了一副可以看见敌人的眼镜,所以他很强势的学会了"发现敌人"的技能. hero.findNearestEnemy()命令,单词多了,首字 ...
- 一个excel文档里复制黏贴另外表单跟着变动_利用Excel连接Power BI,实现PPT报告自动输出...
文/HALI就职于汽车行业战略部门 专注汽车市场信息情报收集和分析 因为工作需要,每月周期性的更新数据和撰写PPT 报告成为繁重的劳动.结果是很多时间花费在数据处理上,真正的分析工作,往往只能草草收 ...
- 设计模式记--Observer Pattern观察者模式
观察者模式--定义了对象之间的一对多依赖,这样一来,当一个对像改变状态时,它的所有依赖者都会收到通知并自动更新. 从定义可以看出,OBSERVER(观察者)模式逻辑上需要两组对象来实现.首先它必需 ...
- poj 3680 Intervals
给定N个带权的开区间,第i个区间覆盖区间(ai,bi),权值为wi.现在要求挑出一些区间使得总权值最大,并且满足实轴上任意一个点被覆盖不超过K次. 1<=K<=N<=200.1< ...
最新文章
- 多线程编程有什么用途_C++ 多线程编程 (一)
- 设计模式之命令模式、举例分析、通俗易懂
- MIT出品2017-2018深度学习最新进展汇总
- decimal类型保留两位小数
- 在网易有道做语音算法工程师是一种怎样的体验?
- Web服务器性能估算
- C#调用mciSendString播放音频文件
- Cow Contest(POJ-3660 )
- Codeforces 853C - Boredom
- 如何使用自动化与分析工具库创建 Excel 直方图
- [SRM] 09 撕书狂魔CZL
- 基于微信小程序的点餐系统源码【包调试运行】
- CAN bus 基础知识
- 帝国CMS Table '***.phome_ecms_news_data_' doesn't exist
- java 9宫格抽奖_九宫格抽奖
- MATLAB 基础与通信系统仿真
- delphi Base64 编解码
- 微信小程序经纬度获取地图导航(导航接入第三方)
- [译] 流量控制(TC)五十年:从基于缓冲队列(Queue)到基于时间戳(EDT)的演进...
- conda删除虚拟环境