POJ 3342 树形DP+Hash
这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了。
今天我又重新捡了起来。(哈哈1A了)
题意:
没有上司的舞会+判重
思路:
hash一下+树形DP
题目中给的人名hash到数字,再进行运算。
树形DP
f[x][0]+=max(f[x.son][0],f[x.son][1]);
f[x][1]+=f[x.son][0];
f[x][0]表示不选这个节点,f[x][1]表示选这个节点。
如果选了这个节点,那么它的儿子必定不选。
如果不选这个节点,它的儿子们可选可不选 取最大的即可。
然后就是坑爹的判重。
怎么判重呢?
如果n为2的话 肯定是No不用解释了吧
然后就从1到n遍历一遍 如果选这个节点和不选这个节点的人数是一样的就遍历它的儿子 如果有任何一个儿子节点选这个儿子节点和不选这个儿子节点的人数是一样的话 那么就是No
否则就是Yes
// by SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,tot,num,first[205],v[666],next[666],Hash[1000008],jya,jyb,f[666][2];
char a[105],b[105];
void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void dfs(int x){
f[x][1]=1;
for(int i=first[x];~i;i=next[i]){
dfs(v[i]);
f[x][0]+=max(f[v[i]][0],f[v[i]][1]);
f[x][1]+=f[v[i]][0];
}
}
int main(){
st:while(scanf("%d",&n)&&n){
scanf("%s",a);
jya=tot=0;num=1;memset(first,-1,sizeof(first));
memset(f,0,sizeof(f)),memset(Hash,0,sizeof(Hash));
int len=strlen(a);
for(int i=0;i<len;i++)jya=(jya*256+a[i])%1000007;
Hash[jya]=1;
for(int i=1;i<n;i++){
scanf("%s%s",a,b);
int lena=strlen(a),lenb=strlen(b);jya=jyb=0;
for(int i=0;i<lena;i++)jya=(jya*256+a[i])%1000007;
if(!Hash[jya])Hash[jya]=++num;
for(int i=0;i<lenb;i++)jyb=(jyb*256+b[i])%1000007;
if(!Hash[jyb])Hash[jyb]=++num;
add(Hash[jyb],Hash[jya]);
}
if(n==2){puts("1 No");goto st;}
dfs(1);
printf("%d ",max(f[1][0],f[1][1]));
for(int i=1;i<=n;i++)
if(f[i][0]==f[i][1])
for(int j=first[i];~j;j=next[j])
if(f[v[j]][0]==f[v[j]][1]){puts("No");goto st;}
puts("Yes");
}
}
POJ 3342 树形DP+Hash的更多相关文章
- BZOJ_3573_[Hnoi2014]米特运输_树形DP+hash
BZOJ_3573_[Hnoi2014]米特运输_树形DP+hash 题意: 给你一棵树每个点有一个权值,要求修改最少的权值,使得每个节点的权值等于其儿子的权值和且儿子的权值都相等. 分析: 首先我们 ...
- Fire (poj 2152 树形dp)
Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000).现在要选择某些点,使得整棵树都被覆盖到.当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同 ...
- poj 1463(树形dp)
题目链接:http://poj.org/problem?id=1463 思路:简单树形dp,如果不选父亲节点,则他的所有的儿子节点都必须选,如果选择了父亲节点,则儿子节点可选,可不选,取较小者. #i ...
- poj 2486( 树形dp)
题目链接:http://poj.org/problem?id=2486 思路:经典的树形dp,想了好久的状态转移.dp[i][j][0]表示从i出发走了j步最后没有回到i,dp[i][j][1]表示从 ...
- poj 3140(树形dp)
题目链接:http://poj.org/problem?id=3140 思路:简单树形dp题,dp[u]表示以u为根的子树的人数和. #include<iostream> #include ...
- Strategic game(POJ 1463 树形DP)
Strategic game Time Limit: 2000MS Memory Limit: 10000K Total Submissions: 7490 Accepted: 3483 De ...
- POJ 2342 树形DP入门题
有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...
- poj 3345 树形DP 附属关系+输入输出(好题)
题目连接:http://acm.hust.edu.cn/vjudge/problem/17665 参考资料:http://blog.csdn.net/woshi250hua/article/detai ...
- POJ 1155 树形DP
题意:电视台发送信号给很多用户,每个用户有愿意出的钱,电视台经过的路线都有一定费用,求电视台不损失的情况下最多给多少用户发送信号. 转自:http://www.cnblogs.com/andre050 ...
随机推荐
- 11.QT窗口布局切割
int main(int argc, char *argv[]) { QApplication a(argc, argv); //MainWindow w; //w.show(); //左右分割 7 ...
- Java入门第一季
慕课网:http://www.imooc.com/learn/85 Java入门知识第一季 1.Java开发环境和IDE的使用: 2.变量和常量 3.常用的运算符 4.流程控制语句 5.数组:使用Ar ...
- kettle的下载、安装和初步使用(Ubuntu 16.04平台下)(图文详解)
不多说,直接上干货! 能够看我这篇博客的博友们,想必是已经具备一定基础了. 扩展博客 kettle的下载.安装和初步使用(windows平台下)(图文详解) kettle的下载 Kettle可以在h ...
- TCP基本概念
TCP协议是一个复杂的.可靠的字节流协议.不通用UDP协议. TCP提供客户与服务器之间的连接.TCP客户先与给定的服务器建立一个连接,再跨该连接与服务器交换数据,最后终止这个连接. TCP提供了可靠 ...
- hdu 1166 敌兵布阵 【线段树】
好好学一下线段树---- 从0开始----加油- 单点更新的 #include<cstdio> #include<cstring> #include<iostream&g ...
- 并发编程——全局解释器锁GIL
1.全局解释器锁GIL GIL其实就是一把互斥锁(牺牲了效率但是保证了数据的安全). 线程是执行单位,但是不能直接运行,需要先拿到python解释器解释之后才能被cpu执行 同一时刻同一个进程内多个线 ...
- 趣学算法 PDF pdf 下载 陈小玉版
趣学算法pdf高清无水印版下载 最近在网上找趣学算法pdf,最后还是买了完整版,今天将本书分享出来,分享给那些和我一样在网上苦苦寻找的小可爱们,有条件的话请支持正版! 链接:https://pan.b ...
- [luogu] P4040 [AHOI2014/JSOI2014]宅男计划(贪心)
P4040 [AHOI2014/JSOI2014]宅男计划 题目背景 自从迷上了拼图,JYY就变成了个彻底的宅男.为了解决温饱问题,JYY不得不依靠叫外卖来维持生计. 题目描述 外卖店一共有N种食物, ...
- css实现透明的两种方式及其区别
一.opacity:0~1 值越高,透明度越低,下面为示例 选择器{ opacity:0.5 } 选择器匹配到的节点们,包括节点们的孩子节点,都会实现%50透明,另 0.5 可直接写成 .5 二.rg ...
- elasticsearch的安装和使用
准备环境: 环境: win7 64位 jdk1.8.0 elasticsearch2.3.3 elasticsearch2.3.3:https://www.elastic.co/thank-you ...