poj 2057 树形DP,数学期望
题目链接: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,数学期望的更多相关文章
- poj 2057 树形dp 贪心
思路:设sum[i],le[i],back[i],worm[i]分别表示以i为根节点需要的完成步数,叶子节点数,失败回退步数,以及i是否有虫. #include<iostream> #in ...
- 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 ...
- 【CF696B】Puzzles(树形DP,期望)
题意:n 个节点的树,初始位置为 1 号节点,初始时间为 1.每次随机地走向任何一个没有走过的子树并且令时间 +1求问走到每一个点时的时间的期望值 思路:比较少见的一道自顶向下的树形DP dp[i]表 ...
- 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 ...
随机推荐
- 查看sqlserver版本
select serverproperty('productversion'),serverproperty('productlevel'),serverproperty('edition')
- vue常见依赖安装
1):$ npm install less less-loader --save 2)style里 <style lang='less'> 2): $ npm i vue-resource ...
- Java日志组件2---Log4j(org.apache.log4j.Logger)
如果我们在项目中,需要记录的东西并不多,而且也不需要有太多区分,使用jdk的自带Log完全可以解决问题.但是,在开发的过程中,大多数项目都比较大,为方便找到程序的bug,都是需要系统的记录日志的.这里 ...
- HTTP的请求头标签 If-Modified-Since
一直以来没有留意过HTTP请求头的IMS(If-Modified-Since)标签. 最近在分析Squid的access.log日志文件时,发现了一个现象.就是即使是对同一个文件进行HTTP请求,第一 ...
- PHP会话管理
Session使用 在每个页面中使用session之前,必须使用session_start() 在每个session中都可以使用$_SESSION这个全局数组,在页面必须调用session_start ...
- [转]ASP.NET中JSON的序列化和反序列化
本文转自:http://www.cnblogs.com/zhaozhan/archive/2011/01/09/1931340.html JSON是专门为浏览器中的网页上运行的JavaScript代码 ...
- 如何使用python将二维数组去重呢?
二维数组的去重,能和一维的方法类似吗?import numpyc=np.array(((1,2),(3,4),(5,6),(7,8),(7,8),(3,4),(1,2)))print('二维数组:\n ...
- MyEclipse 比较常用的快捷键
Ctrl+D: 删除当前行 Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了) Alt+↑ 当前行和上面一行交互位置(同上) Alt+← 前一个编辑的页面 Alt+→ 下一个编 ...
- JS匿名函数递归实现阶乘
var rs = (function (value) { if (value > 1) return value * arguments.callee(value - 1); return va ...
- [JAVA][Liferay] Configure sharding in multiple sites
create databases first portal-ext.properties配置 hibernate.dialect=org.hibernate.dialect.PostgreSQLDia ...