题目大意:在一个树形迷宫中,以房间为节点。有n间房间,每间房间存在陷阱的概率为ki,存在出口的概率为ei,如果这两种情况都不存在(概率为pi),那么只能做出选择走向下一个房间(包括可能会走向上一个房间)。根节点为1,当遇到陷阱时必须返回到根节点1处重新开始,当遇到出口时,走出迷宫。问从开始到走出迷宫所做出选择次数的期望值。

题目分析:定义状态dp(i)表示在节点 i 处直到走出迷宫的选择次数期望值。则状态转移方程为:

dp(i)=ki*dp(1)+(1/m)*pi*∑(dp(son)+1)  (i为叶子节点)  <1>

dp(i)=ki*dp(1)+(1/m)*pi*(dp(father)+1)+(1/m)*pi*∑(dp(son)+1)  (i为非叶子节点)  <2>

将<2>整理一下,得到:

dp(i)=ki*dp(1)+(1/m)*pi*dp(father)+(1/m)*pi*∑dp(son)+pi

显然,dp(i)都与dp(1)有关,另dp(i)=A(i)*dp(1)+B(i)*dp(father)+C(i)  <3>

将<3>带入∑dp(son),得到:

(1-(pi/m)*∑A(son))dp(i)=(ki+(pi/m)∑A(son))*dp(1)+(pi/m)*dp(father)+(pi/m)*∑C(son)+pi

显然,A(i),B(i),C(i)可得。

dp(1)=C(1)/(1-A(1)) 即为答案。

代码如下:

# include<iostream>
# include<cstdio>
# include<cmath>
# include<vector>
# include<cstring>
# include<algorithm>
using namespace std; const int N=10005;
const int INF=100000;
const double eps=1e-9; int n;
double k[N];
double e[N];
double A[N],B[N],C[N];
vector<int>G[N]; bool dfs(int u,int fa)
{
int m=G[u].size();
double temp=0;
A[u]=k[u];
B[u]=(1-k[u]-e[u])/m;
C[u]=1-k[u]-e[u];
for(int i=0;i<m;++i){
int v=G[u][i];
if(v==fa) continue;
if(!dfs(v,u)) return false;
A[u]+=(1-k[u]-e[u])*A[v]/m;
C[u]+=(1-k[u]-e[u])*C[v]/m;
temp+=(1-k[u]-e[u])*B[v]/m;
}
if(fabs(1-temp)<eps) return false;
A[u]/=(1-temp);
B[u]/=(1-temp);
C[u]/=(1-temp);
return true;
} int main()
{
int T,x,y,cas=0;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
G[i].clear();
for(int i=1;i<n;++i){
scanf("%d%d",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
}
for(int i=1;i<=n;++i){
scanf("%lf%lf",k+i,e+i);
k[i]/=100;
e[i]/=100;
}
printf("Case %d: ",++cas);
if(dfs(1,-1)&&fabs(1-A[1])>eps)
printf("%.6lf\n",C[1]/(1-A[1]));
else printf("impossible\n");
}
return 0;
}

  

HDU-4035 Maze (概率DP求期望)的更多相关文章

  1. HDU 4035 Maze 概率dp,树形dp 难度:2

    http://acm.hdu.edu.cn/showproblem.php?pid=4035 求步数期望,设E[i]为在编号为i的节点时还需要走的步数,father为dfs树中该节点的父节点,son为 ...

  2. hdu 4035 Maze 概率DP

        题意:    有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树,    从结点1出发,开始走,在每个结点i都有3种可能:        1.被杀死,回到结点1处(概率为ki)      ...

  3. HDU 3853 LOOP (概率DP求期望)

    D - LOOPS Time Limit:5000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit St ...

  4. HDU 4035 Maze 概率DP 搜索

    解题报告链接: http://www.cnblogs.com/kuangbin/archive/2012/10/03/2711108.html 先推公式,设计状态,令DP[i]表示在房间i退出要走步数 ...

  5. HDU3853-LOOPS(概率DP求期望)

    LOOPS Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others) Total Su ...

  6. hdu4035 Maze (树上dp求期望)

    dp求期望的题. 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点1处(概率为ki) 2.找到出口,走出迷宫 ...

  7. POJ2096 Collecting Bugs(概率DP,求期望)

    Collecting Bugs Ivan is fond of collecting. Unlike other people who collect post stamps, coins or ot ...

  8. LightOJ 1030 【概率DP求期望】

    借鉴自:https://www.cnblogs.com/keyboarder-zsq/p/6216762.html 题意:n个格子,每个格子有一个值.从1开始,每次扔6个面的骰子,扔出几点就往前几步, ...

  9. HDU 5245 Joyful(概率题求期望)

    D - Joyful Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit S ...

  10. HDU 4405 Aeroplane chess (概率DP求期望)

    题意:有一个n个点的飞行棋,问从0点掷骰子(1~6)走到n点须要步数的期望 当中有m个跳跃a,b表示走到a点能够直接跳到b点. dp[ i ]表示从i点走到n点的期望,在正常情况下i点能够到走到i+1 ...

随机推荐

  1. linux下的powershell,pash试用手记

    ------1 概述------ 1.1 简单来说linux,unix是非常依赖脚本的,而win不是.win中有很多图形程序+c库,效率不比脚本差.点几下鼠标照样能完成需求.当 然,图形和字符是两码事 ...

  2. C语言中最常用的三种输入输出函数scanf()、printf()、getchar()和putchar()

    本文给大家介绍C语言中最常用的三种输入输出函数scanf().printf().getchar()和putchar(). 一.scanf()函数格式化输入函数scanf()的功能是从键盘上输入数据,该 ...

  3. primitive数据类型

    /*primitive数据类型 *primitive主要是用来存储原始的数据 *boolean\byte\short\int\long\double **/public class Shujuleix ...

  4. hadoop版本和位数的查看方法

    目前针对apache hadoop更新的版本较多,由此而产生了两个方面的问题: 1.如何查看运行的集群当中的hadoop的版本的问题. 2.如何查看运行集群当中的hadoop的位数 下面详细的介绍一下 ...

  5. DirectX 总结和DirectX 9.0 学习笔记

    转自:http://www.cnblogs.com/graphics/archive/2009/11/25/1583682.html DirectX 总结 DDS DirectXDraw Surfac ...

  6. sql server和oracle的差异

    .部分SQL语句差异 (1)SQL:select top 10 * from table     ORA: select * from table where rownum<11(2)SQL:S ...

  7. Wythoff's game

    这个问题就是OJ题里出现的取石子游戏,http://en.wikipedia.org/wiki/Wythoff%27s_game. 维基里面的通项公式并不适用于算法求解.需要理解下面两条规律: 1.A ...

  8. Python网络编程03----Python3.*中socketserver

    socketserver(在Python2.*中的是SocketServer模块)是标准库中一个高级别的模块.用于简化网络客户与服务器的实现(在前面使用socket的过程中,我们先设置了socket的 ...

  9. 详解定位—>"position"

    position是css中一个重要的属性,他规定元素的定位类型,默认值为static,他的值有5种,absolute,fixed,relative,static,inherit.接下来将详细具体对每一 ...

  10. php大力力 [009节]php在百度文库的几个基础教程

    2015-08-23 php大力力009. php在百度文库的几个基础教程 php大力力 [009节]php在百度文库的几个基础教程 PHP脚本中操作MySQL数据库3-猿代码平台 php基础教程-绝 ...