题目大意:在一个树形迷宫中,以房间为节点。有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)) 即为答案。

代码如下:

  1. # include<iostream>
  2. # include<cstdio>
  3. # include<cmath>
  4. # include<vector>
  5. # include<cstring>
  6. # include<algorithm>
  7. using namespace std;
  8.  
  9. const int N=10005;
  10. const int INF=100000;
  11. const double eps=1e-9;
  12.  
  13. int n;
  14. double k[N];
  15. double e[N];
  16. double A[N],B[N],C[N];
  17. vector<int>G[N];
  18.  
  19. bool dfs(int u,int fa)
  20. {
  21. int m=G[u].size();
  22. double temp=0;
  23. A[u]=k[u];
  24. B[u]=(1-k[u]-e[u])/m;
  25. C[u]=1-k[u]-e[u];
  26. for(int i=0;i<m;++i){
  27. int v=G[u][i];
  28. if(v==fa) continue;
  29. if(!dfs(v,u)) return false;
  30. A[u]+=(1-k[u]-e[u])*A[v]/m;
  31. C[u]+=(1-k[u]-e[u])*C[v]/m;
  32. temp+=(1-k[u]-e[u])*B[v]/m;
  33. }
  34. if(fabs(1-temp)<eps) return false;
  35. A[u]/=(1-temp);
  36. B[u]/=(1-temp);
  37. C[u]/=(1-temp);
  38. return true;
  39. }
  40.  
  41. int main()
  42. {
  43. int T,x,y,cas=0;
  44. scanf("%d",&T);
  45. while(T--)
  46. {
  47. scanf("%d",&n);
  48. for(int i=1;i<=n;++i)
  49. G[i].clear();
  50. for(int i=1;i<n;++i){
  51. scanf("%d%d",&x,&y);
  52. G[x].push_back(y);
  53. G[y].push_back(x);
  54. }
  55. for(int i=1;i<=n;++i){
  56. scanf("%lf%lf",k+i,e+i);
  57. k[i]/=100;
  58. e[i]/=100;
  59. }
  60. printf("Case %d: ",++cas);
  61. if(dfs(1,-1)&&fabs(1-A[1])>eps)
  62. printf("%.6lf\n",C[1]/(1-A[1]));
  63. else printf("impossible\n");
  64. }
  65. return 0;
  66. }

  

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. 微软TechEd2013大会门票热卖!

    微软TechEd2013大会将在北京.上海两地隆重举行! 会议时间安排如下: 北京:12月5日—6日  国家会议中心 上海:12月11日—12日  国际会议中心 现在是门票热卖时期,票价:2688.0 ...

  2. poj1179

    //Accepted 244 KB 0 ms //区间dp //石子合并模型 #include <cstdio> #include <cstring> #include < ...

  3. 虚拟机安装Linux系统图文教程

    虚拟机安装Linux系统图文教程 | 浏览:523 | 更新:2014-09-16 15:31 1 2 3 4 5 6 7 分步阅读 Linux系统的安装 工具/原料 VMware 9.0 虚拟机 L ...

  4. C++数据结构之Stack(栈)

    stack,栈,是好比堆积木似的数据结构,从上之下堆积,取出时按"LIFO"-last int first out后进先出的规则.栈一般为线程所独有,也就是每个线程有其自有的栈,与 ...

  5. C++11 实现 argsort

    看python发现有这么个api,感觉很实用,想着stl里会不会有这个呢?查了半天毫无结果.于是用lambda自己实现了下. 以vector为例 template<typename T> ...

  6. ios工程中ARC与非ARC的混合

    ARC与非ARC在一个项目中同时使用, 1,选择项目中的Targets,选中你所要操作的Target,2,选Build Phases,在其中Complie Sources中选择需要ARC的文件双击,并 ...

  7. 一群猴子排成一圈,按1,2,...n 编号,数到m只,踢出局,直到剩下最后一个猴子是大王

    <?php/***function king*@param $m 数到m个数, $n 猴子个数*return int*/function king($m, $n){    //定义数组, 值为猴 ...

  8. ZOJ 3811

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5343 网络赛这水题没写过太伤了,赛后写了下1A. 当时钻牛角尖一定要用k次bf ...

  9. [图论]Floyd 算法小结

    Floyd 算法小结  By Wine93 2013.11 1. Floyd算法简介 Floyd算法利用动态规划思想可以求出任意2点间的最短路径,时间复杂度为O(n^3),对于稠密图, 效率要高于执行 ...

  10. GOLANG 反射法则

    译自[blog.golang.org/laws-of-reflection] 在计算机中, 反射是程序通过类型,检测到它自己的结构能力:是一种元编程程:也是一个具大的混淆点 在本文中,我们将通过解释反 ...