POJ3342 Party at Hali-Bula(树形DP)
dp[u][0]表示不选u时在以u为根的子树中最大人数,dp[u][1]则是选了u后的最大人数;
f[u][0]表示不选u时的唯一性,f[u][1]是选了u后的唯一性,值为1代表唯一,0代表不唯一。
当不选u时,u的子节点v可选可不选,dp[u][0]+=max(dp[v][0],dp[v][1]),再根据所选判断f[u][0];
当选u时,u的子节点都不可选,dp[u][1]+=dp[v][0],再判断f[u][1];
在这里可以用map将人名映射为数字,map<string,int> mp 。
- 1 #include<iostream>
- 2 #include<cstdio>
- 3 #include<algorithm>
- 4 #include<string>
- 5 #include<cstring>
- 6 #include<map>
- 7 #include<vector>
- 8 using namespace std;
- 9 int dp[210][2],f[210][2];
- 10 vector<int>E[210];
- 11
- 12 void dfs(int u){
- 13 dp[u][0]=0;
- 14 dp[u][1]=1;
- 15 for(int i=0;i<E[u].size();i++){
- 16 int v=E[u][i];
- 17 dfs(v);
- 18 if(dp[v][0]==dp[v][1]){
- 19 dp[u][0]+=dp[v][0];
- 20 f[u][0]=0;
- 21 }
- 22 else if(dp[v][0]>dp[v][1]){
- 23 dp[u][0]+=dp[v][0];
- 24 if(!f[v][0]) f[u][0]=0;
- 25 }
- 26 else{
- 27 dp[u][0]+=dp[v][1];
- 28 if(!f[v][1]) f[u][0]=0;
- 29 }
- 30 dp[u][1]+=dp[v][0];
- 31 if(!f[v][0]) f[u][1]=0;
- 32 }
- 33 }
- 34
- 35 int main(){
- 36 int n,k;
- 37 string s1,s2;
- 38 map<string,int> mp;//将字符串映射为数字
- 39 while(cin>>n&&n){
- 40 mp.clear();
- 41 for(int i=0;i<=n;i++) E[i].clear(); //清空
- 42 memset(f,1,sizeof(f));//初始都设为唯一
- 43 k=1;
- 44 cin>>s1;
- 45 mp[s1]=k++;
- 46 E[0].push_back(mp[s1]);//增加超根
- 47 for(int i=1;i<=n-1;i++){
- 48 cin>>s1>>s2;
- 49 if(mp[s1]==0) mp[s1]=k++;
- 50 if(mp[s2]==0) mp[s2]=k++;
- 51 E[mp[s2]].push_back(mp[s1]);
- 52 }
- 53 dfs(0);//从根开始遍历
- 54 printf("%d ",dp[0][0]);
- 55 if(f[0][0]) printf("Yes\n");
- 56 else printf("No\n");
- 57 }
- 58 return 0;
- 59 }
POJ3342 Party at Hali-Bula(树形DP)的更多相关文章
- poj3417 LCA + 树形dp
Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4478 Accepted: 1292 Descripti ...
- COGS 2532. [HZOI 2016]树之美 树形dp
可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...
- 【BZOJ-4726】Sabota? 树形DP
4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 128 Solved ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
- 树形DP
切题ing!!!!! HDU 2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...
- BZOJ 2286 消耗战 (虚树+树形DP)
给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...
- POJ2342 树形dp
原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...
- hdu1561 The more, The Better (树形dp+背包)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...
- bzoj2500: 幸福的道路(树形dp+单调队列)
好题.. 先找出每个节点的树上最长路 由树形DP完成 节点x,设其最长路的子节点为y 对于y的最长路,有向上和向下两种情况: down:y向子节点的最长路g[y][0] up:x的次长路的g[x][1 ...
随机推荐
- 标准的Switch语句和穿透的Switch语句
第三章 选择语句 3.1选择语句--Switch switch语句格式: ```java switch(表达式){ case 常量值1: 语句体1; break; case 常量值2: 语句体2; b ...
- 基于Python3(Autosub)以及Ffmpeg配合GoogleTranslation(谷歌)为你的影片实现双语版字幕(逐字稿)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_169 为影片加字幕其实是一件非常耗费时间的事情,尤其是对于打字慢的朋友来说.当然不光为影片加字幕,在其他领域,类似的逐字稿也是工作 ...
- Odoo14 groups && rule
# Odoo14 groups && rule # admin账户以及权限的来源: # admin创建代码在:odoo/odoo/addons/base/data/res_users_ ...
- Java学习 (八)基础篇 运算符
目录 运算符 基本运算符 1.一元基础运算(重点) 一元运算符 (a++ / ++a) (a-- / --a) 2.二元基础运算 基础 计算返回值类型 关系运算 幂运算 3.三元运算符 4.逻辑运算符 ...
- 5.8 NOI 模拟
\(T1\) 比较容易想到的 二分转化为判定,判定是否存在一个子图能保证能一直在\(x\)时间内到达\(n\) 设\(dis(u,v)\)表示\(u->v\)的最短路 先找出候选节点\(i,di ...
- 巧用Prometheus来扩展kubernetes调度器
Overview 本文将深入讲解 如何扩展 Kubernetes scheduler 中各个扩展点如何使用,与扩展scheduler的原理,这些是作为扩展 scheduler 的所需的知识点.最后会完 ...
- [CSharpTips]判断两条线段是否相交
判断两条线段是否相交 主要用到了通过向量积的正负判断两个向量位置关系 向量a×向量b(×为向量叉乘),若结果小于0,表示向量b在向量a的顺时针方向:若结果大于0,表示向量b在向量a的逆时针方向:若等于 ...
- 2019 CSP-S Ⅱ 游记
day0(试机) 第零天,重新打了一遍头文件和读优,熟悉了一下就匆匆走了. day1 T1一看到先把二分打了,然后发现long long要爆,好慌 主要是基础知识不够扎实,不知道unsigned lo ...
- window桌面背景图片
通过修改注册表项: \HKEY_CURRENT_USER\Control Panel\Desktop下的几个值,及可以将我们想要的图片设置成桌面的背景图 TileWallpaper Wallpap ...
- Python入门系列(一)安装环境
python是什么 python是一门很受欢迎的语言,除了不能生孩子以外,其它都可以做. 它擅长的领域是脚本工具和科学数据这一块,比如大数据,数据分析什么的. python安装 为了演示和验证教程可用 ...