这是很久很久以前做的一道题,可惜当时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");}
}

转载于:https://www.cnblogs.com/SiriusRen/p/6532347.html

POJ 3342 树形DP+Hash相关推荐

  1. Fire (poj 2152 树形dp)

    Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000).现在要选择某些点,使得整棵树都被覆盖到.当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同 ...

  2. bzoj3162 独钓寒江雪(树形dp+Hash)

    就是求无根树的本质不同的独立集个数.如果不考虑本质不同,则有树形dp. 考虑本质不同,就要考虑无根树的同构,可以用hash来搞.具体题解见:portal 我的hash真是冲突到死[再见],hash值最 ...

  3. poj 2342 树形DP

    树形DP入门题目. 树形DP说白了就是在搜索的时候动态规划. 只要你懂的深搜+动态规划,就能理解这个基础题了. 先直接搜索到最底层,然后一层一层动态规划,可以说有点像数塔. dp[i][1],dp[i ...

  4. poj 2486 树形dp

    思路:这题是裸的树形dp.dp[i][j]表示第i个节点花费j步并且从子节点返回,能得到的最大苹果数:nback[i[j]表示第i个节点花费j步并且进入某个子节点不返回,能得到的最大苹果数.那么我们就 ...

  5. poj 2152 树形dp(建立消防站)

    题意:给定n个节点组成的树,树边有权.现在要在一些点上建立消防站,每个点建站都有花费cost[i].如果某点上没有消防站,那么在距离它d[i]之内的某个点上必须有消防站.求符合上述条件的最小费用建站方 ...

  6. POJ 2342 (树形DP)

    题目链接: http://poj.org/problem?id=2342 题目大意:直属上司和下属出席聚会.下属的上司出现了,下属就不能参加,反之下属参加.注意上司只是指直属的上司.每个人出席的人都有 ...

  7. poj 1947(树形dp+背包问题)

    题大意是:给你一棵节点为n的树,问至少砍几刀可以孤立出一棵节点为m的子树. 解题思路:这题很容易想到状态dp[i][j]表示以i节点为根,节点总数为j的子树最少需要切几刀.但是这个状态方程确实很难想, ...

  8. poj 3417 树形dp+LCA

    思路:我以前一直喜欢用根号n分段的LCA.在这题上挂了,第一次发现这样的LCA被卡.果断改用Tarjan离线算法求LCA. 当前节点为u,其子节点为v.那么: 当以v根的子树中含有连接子树以外点的边数 ...

  9. poj 2057 树形DP,数学期望

    题目链接:http://poj.org/problem?id=2057 题意:有一只蜗牛爬上树睡着之后从树上掉下来,发现后面的"房子"却丢在了树上面, 现在这只蜗牛要求寻找它的房子 ...

最新文章

  1. 《虚拟化与云计算》读书感(三)数据中心的概述
  2. 微软系统遭*** 谴责人为失误
  3. 神策数据成林松:数据智能在业务场景下的应用(附 PPT 下载)
  4. UI Automation
  5. c# datatable.select() 支持group by
  6. 小tip: base64:URL背景图片与web页面性能优化(转载)
  7. 记录一次 Ubuntu 16.04 path 错误救机
  8. 关于java.lang.NoClassDefFoundError的问题
  9. 第五章 列表、元组和字符串[DDT书本学习 小甲鱼]【8】
  10. 复数矩阵Cholesky分解算法的C++实现
  11. 360浏览器不能打开CSDN登陆页面
  12. win10计算机等应用不能能用,Win10电脑无法安装应用软件的解决办法
  13. android APK加密、签名
  14. VS Code\unins000.exe创建报错解决方法
  15. 腾讯云支付系统架构介绍
  16. 转载: dropout为啥要rescale?
  17. ipscan(ip端口扫描工具) 2.21 中文绿色版 局域网ip端口扫描神器
  18. SQL Server 2019下载及安装教程
  19. spark infer parquet schema
  20. 针对Object和Array深拷贝处理

热门文章

  1. 面试官问:Redis变慢了,你会怎么排查?
  2. MySQL中 Order By 和 Limit 的排序问题
  3. SpringBoot第十六篇:用restTemplate消费服务
  4. 人工智能产业趋势和机遇!
  5. 风控算法干货交流来了!
  6. 【教程】Python数据可视化技巧
  7. Python 代码转 Latex 公式,这个开源库用一行代码帮你搞定
  8. 2400门课:MIT 开放迄今最全 计算机+电气工程课程
  9. 深度学习(计算机视觉方向)小白入门的一些建议
  10. 24个必须掌握的数据库面试问题~