题目链接:http://poj.org/problem?id=2057

题意:有一只蜗牛爬上树睡着之后从树上掉下来,发现后面的"房子"却丢在了树上面, 现在这只蜗牛要求寻找它的房子,它又得从树根开始爬起,现在要求一条路径使得其找到房子
所要爬行的期望距离最小. 爬行距离如下计算, 题目规定每一个分支和枝末都看做是一个节点, 这些节点之间的距离都是1, 在分支上可能会有热心的毛毛虫, 这些毛毛虫会如实的告诉蜗牛他之前是否经过这条路径, 也正是因为毛毛虫, 因此询问毛毛虫的顺序使得这题的期望是不同的. 输入数据时给定的一个邻接关系,通过上一个节点来构图 ;同时字符 'Y'表示该点有毛毛虫, 字符'N'表示该点

分析:

die[i]表示以 i 为根结点找不到房子时要爬行的最少距离。

当 i 没有毛毛虫的时候  j 是 i 的子节点。

当 i 有毛毛虫的时候 ;

win[i]表示以 i 为根结点时,选好所有分支后,枚举完所有房子落在所有叶子结点的时候,要爬的最短距离。

就是说:当我走到 j 而找到时,前面的都失败了。而 j 成功了。j 子树 又有很多叶子结点。其中只有一个是成功的(并不知道是哪个)。

如图:

然后就是对于 i 结点来说,怎么访问才使得重复结点最少。

那就是 

 #include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring> using namespace std; const int maxn = ;
int pos[maxn];
int snode[maxn];
int die[maxn];
int win[maxn];
int n; vector<int>vec[maxn]; void init()
{
memset(pos,,sizeof(pos));
memset(snode,,sizeof(snode));
memset(die,,sizeof(die));
memset(win,,sizeof(win)); char ps;
int pre;
for(int i=;i<=n;i++) {
vec[i].clear();
} for(int i=;i<=n;i++) {
scanf("%d %c%*c",&pre,&ps);
if(pre==-) continue;
vec[pre].push_back(i);
if(ps=='Y') pos[i] = ;
}
} int cmp(int a,int b) {
return (die[a]+)*snode[b]<(die[b]+)*snode[a];
} void dfs(int x) {
int len = vec[x].size();
for(int i=;i<len;i++)
dfs(vec[x][i]);
if(len ==)
{
snode[x] = ;
die[x] = ;
win[x] = ;
return;
}
for(int i=;i<len;i++) {
snode[x] +=snode[vec[x][i]];
if(pos[x]==) die[x] +=die[vec[x][i]] + ;
} int tmp[];
for(int i=;i<len;i++) {
tmp[i] = vec[x][i];
} int sum = ;
sort(tmp,tmp+len,cmp);
for(int i=;i<len;i++) {
win[x] +=(sum+)*snode[tmp[i]] + win[tmp[i]];
sum +=die[tmp[i]]+;
} } int main()
{
while(scanf("%d%*c",&n),n) {
init();
double ans;
dfs();
ans = 1.0*win[]/snode[];
printf("%.4lf\n",ans);
}
return ;
}

poj 2057 树形DP,数学期望的更多相关文章

  1. poj 2057 树形dp 贪心

    思路:设sum[i],le[i],back[i],worm[i]分别表示以i为根节点需要的完成步数,叶子节点数,失败回退步数,以及i是否有虫. #include<iostream> #in ...

  2. Fire (poj 2152 树形dp)

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

  3. poj 1463(树形dp)

    题目链接:http://poj.org/problem?id=1463 思路:简单树形dp,如果不选父亲节点,则他的所有的儿子节点都必须选,如果选择了父亲节点,则儿子节点可选,可不选,取较小者. #i ...

  4. poj 2486( 树形dp)

    题目链接:http://poj.org/problem?id=2486 思路:经典的树形dp,想了好久的状态转移.dp[i][j][0]表示从i出发走了j步最后没有回到i,dp[i][j][1]表示从 ...

  5. poj 3140(树形dp)

    题目链接:http://poj.org/problem?id=3140 思路:简单树形dp题,dp[u]表示以u为根的子树的人数和. #include<iostream> #include ...

  6. 【CF696B】Puzzles(树形DP,期望)

    题意:n 个节点的树,初始位置为 1 号节点,初始时间为 1.每次随机地走向任何一个没有走过的子树并且令时间 +1求问走到每一个点时的时间的期望值 思路:比较少见的一道自顶向下的树形DP dp[i]表 ...

  7. Strategic game(POJ 1463 树形DP)

    Strategic game Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 7490   Accepted: 3483 De ...

  8. POJ 2342 树形DP入门题

    有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...

  9. poj 3345 树形DP 附属关系+输入输出(好题)

    题目连接:http://acm.hust.edu.cn/vjudge/problem/17665 参考资料:http://blog.csdn.net/woshi250hua/article/detai ...

随机推荐

  1. 转 oracle 默认自动统计信息 时间修改

    ############sql3: https://blog.csdn.net/dataminer_2007/article/details/41363417http://blog.51cto.com ...

  2. 转:zookeeper配置运行——较为详细的教程

    zookeeper:http://blog.csdn.net/morning99/article/details/40426133 dubbo+zookeeper详细:http://www.cnblo ...

  3. getResourceAsStream小结

    前提:我用的是gradle工程,文件放在resource下,resource对应的就是类路径,文件的路径和代码的路径保持一致,如Client的包名和peizhi.properties一致,例如Clie ...

  4. maya2014安装失败如何卸载重装

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  5. 性能测试工具LoadRunner22-LR之Analysis 简介

    Analysis功能: 对测试运行结果进行查看.分析和比较 导入分析文件 注意LoadRunner Results文件和Analysis Session Files的区别.LoadRunner Res ...

  6. 04-spring中的aop演示

    1 xml配置 1 导包 2 准备对象 package www.test.service; public interface UserService { public abstract void ad ...

  7. CentOS 开机自启动脚本

    开机时执行自己的脚本. 1.编写自己的服务脚本 进入系统服务脚本目录: cd /etc/rc.d/init.d/ vi test 内容如下: #!/bin/bash # # chkconfig: - ...

  8. PHP算法——生成唯一字符串

    经常遇到忘记密码的情况,点击一下忘记密码,然后收到更改密码的链接,连接中往往都会有一段很长而且很乱的字符串.试想一下,如果出现了重复的字符串,那岂不是把别人的密码给重置了? 所以产生唯一数对于网站的安 ...

  9. jq学习总结之方法

    三.方法 1.length 2.index()3.get() reverse()4.not()5.filter()6.find()7.each()8.addBack()9.attr()10.toggl ...

  10. Ubuntu15.10下安装Docker

    1.首先查看linux系统版本 head -n 1 /etc/issue 2.升级包管理器 sudo apt-get update sudo apt-get install apt-transport ...