题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4035

  很不错的概率DP题目,因为这题是无向图,所以要对叶节点和非叶节点考虑,然后列出方程后,因为数据很大,高斯消元如果不特定优化会超时,可以转化方程,然后求解系数。

解法:<摘自KB神>

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

设 E[i]表示在结点i处,要走出迷宫所要走的边数的期望。E[1]即为所求。

叶子结点:
E[i] = ki*E[1] + ei*0 + (1-ki-ei)*(E[father[i]] + 1);
= ki*E[1] + (1-ki-ei)*E[father[i]] + (1-ki-ei);

非叶子结点:(m为与结点相连的边数)
E[i] = ki*E[1] + ei*0 + (1-ki-ei)/m*( E[father[i]]+1 + ∑( E[child[i]]+1 ) );
= ki*E[1] + (1-ki-ei)/m*E[father[i]] + (1-ki-ei)/m*∑(E[child[i]]) + (1-ki-ei);

设对每个结点:E[i] = Ai*E[1] + Bi*E[father[i]] + Ci;

对于非叶子结点i,设j为i的孩子结点,则
∑(E[child[i]]) = ∑E[j]
= ∑(Aj*E[1] + Bj*E[father[j]] + Cj)
= ∑(Aj*E[1] + Bj*E[i] + Cj)
带入上面的式子得
(1 - (1-ki-ei)/m*∑Bj)*E[i] = (ki+(1-ki-ei)/m*∑Aj)*E[1] + (1-ki-ei)/m*E[father[i]] + (1-ki-ei) + (1-ki-ei)/m*∑Cj;
由此可得
Ai = (ki+(1-ki-ei)/m*∑Aj) / (1 - (1-ki-ei)/m*∑Bj);
Bi = (1-ki-ei)/m / (1 - (1-ki-ei)/m*∑Bj);
Ci = ( (1-ki-ei)+(1-ki-ei)/m*∑Cj ) / (1 - (1-ki-ei)/m*∑Bj);

对于叶子结点
Ai = ki;
Bi = 1 - ki - ei;
Ci = 1 - ki - ei;

从叶子结点开始,直到算出 A1,B1,C1;

E[1] = A1*E[1] + B1*0 + C1;
所以
E[1] = C1 / (1 - A1);
若 A1趋近于1则无解...

  1 //STATUS:C++_AC_281MS_1440KB
  2 #include <functional>
  3 #include <algorithm>
  4 #include <iostream>
  5 //#include <ext/rope>
  6 #include <fstream>
  7 #include <sstream>
  8 #include <iomanip>
  9 #include <numeric>
 10 #include <cstring>
 11 #include <cassert>
 12 #include <cstdio>
 13 #include <string>
 14 #include <vector>
 15 #include <bitset>
 16 #include <queue>
 17 #include <stack>
 18 #include <cmath>
 19 #include <ctime>
 20 #include <list>
 21 #include <set>
 22 #include <map>
 23 using namespace std;
 24 //#pragma comment(linker,"/STACK:102400000,102400000")
 25 //using namespace __gnu_cxx;
 26 //define
 27 #define pii pair<int,int>
 28 #define mem(a,b) memset(a,b,sizeof(a))
 29 #define lson l,mid,rt<<1
 30 #define rson mid+1,r,rt<<1|1
 31 #define PI acos(-1.0)
 32 //typedef
 33 typedef __int64 LL;
 34 typedef unsigned __int64 ULL;
 35 //const
 36 const int N=10010;
 37 const int INF=0x3f3f3f3f;
 38 const int MOD=10007,STA=8000010;
 39 const LL LNF=1LL<<55;
 40 const double EPS=1e-9;
 41 const double OO=1e30;
 42 const int dx[4]={-1,0,1,0};
 43 const int dy[4]={0,1,0,-1};
 44 const int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
 45 //Daily Use ...
 46 inline int sign(double x){return (x>EPS)-(x<-EPS);}
 47 template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
 48 template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
 49 template<class T> inline T lcm(T a,T b,T d){return a/d*b;}
 50 template<class T> inline T Min(T a,T b){return a<b?a:b;}
 51 template<class T> inline T Max(T a,T b){return a>b?a:b;}
 52 template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);}
 53 template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);}
 54 template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));}
 55 template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));}
 56 //End
 57
 58 vector<int> q[N];
 59 double k[N],e[N],A[N],B[N],C[N];
 60 int T,n;
 61
 62 void dfs(int u,int fa)
 63 {
 64     int i,j,v,m=q[u].size();
 65     double P=(1-k[u]-e[u])/(m);
 66     double At,Bt,Ct;
 67     At=Bt=Ct=0;
 68     for(i=0;i<m;i++){
 69         v=q[u][i];
 70         if(v==fa)continue;
 71         dfs(v,u);
 72         At+=A[v];
 73         Bt+=B[v];
 74         Ct+=C[v];
 75     }
 76     A[u]=(P*At+k[u])/(1-P*Bt);
 77     B[u]=P/(1-P*Bt);
 78     C[u]=(P*Ct+1-k[u]-e[u])/(1-P*Bt);
 79 }
 80
 81 int main(){
 82  //   freopen("in.txt","r",stdin);
 83     int ca=1,i,j,a,b;
 84     scanf("%d",&T);
 85     while(T--)
 86     {
 87         scanf("%d",&n);
 88         for(i=1;i<=n;i++)q[i].clear();
 89         for(i=1;i<n;i++){
 90             scanf("%d%d",&a,&b);
 91             q[a].push_back(b);
 92             q[b].push_back(a);
 93         }
 94         for(i=1;i<=n;i++){
 95             scanf("%lf%lf",&k[i],&e[i]);
 96             k[i]/=100,e[i]/=100;
 97         }
 98
 99         dfs(1,0);
100
101         printf("Case %d: ",ca++);
102         if(sign(A[1]-1))printf("%.6lf\n",C[1]/(1-A[1]));
103         else printf("impossible\n");
104     }
105     return 0;
106 }

转载于:https://www.cnblogs.com/zhsl/p/3240168.html

HDU-4035 Maze 概率DP相关推荐

  1. HDU - 4035 Maze(概率dp)

    题目链接:点击查看 题目大意:给出一个 n 个点的树,初始时位于点 1 ,每个点都会给出一个概率 k[ i ] 和一个概率 e[ i ] ,其代表的意义分别是: k[ i ] :在点 i 有 k[ i ...

  2. hdu 3853 LOOPS 概率DP

    简单的概率DP入门题 代码如下: 1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 ...

  3. HDU 4035 Maze(树形概率DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4035 题意:一棵树,从结点1出发,在每个结点 i 都有3种可能:(1)回到结点1 , 概率 Ki:(2 ...

  4. HDU 4035 Maze

    Maze http://acm.hdu.edu.cn/showproblem.php?pid=4035 分析: 在树上走来走去,然后在一个点可以k的概率回到1,可以e的概率走出去,可以1-k-e的概率 ...

  5. LOOPS HDU - 3853 (概率dp):(希望通过该文章梳理自己的式子推导)

    题意:就是让你从(1,1)走到(r, c)而且每走一格要花2的能量,有三种走法:1,停住.2,向下走一格.3,向右走一格.问在一个网格中所花的期望值. 首先:先把推导动态规划的基本步骤给出来. · 1 ...

  6. 线性代数五之高斯消元——[SDOI2010]外星千足虫,[HNOI2013]游走,[HNOI2011]XOR和路径,[hdu 4035]Maze

    多类型高斯消元杂题 [SDOI2010]外星千足虫 description solution code [HNOI2013]游走 description solution code [HNOI2011 ...

  7. LOOPS HDU - 3853(概率dp,期望)

    题意: 有一个R*C的方格.一个人想从(1,1)走到(r,c).在每个格子都有三种选择,向下,向右,或者原地不动.每个格子里的每个选择都有一定的概率.而每次移动都需要消耗2点的能量,问期望消耗的能量是 ...

  8. hdu 3853 LOOPS (概率dp 逆推求期望)

    题目链接 LOOPS Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others) Tot ...

  9. 【原创】概率DP总结 by kuangbin

    概率DP主要用于求解期望.概率等题目. 转移方程有时候比较灵活. 一般求概率是正推,求期望是逆推.通过题目可以体会到这点. 首先先推荐几篇参考的论文: <信息学竞赛中概率问题求解初探> & ...

最新文章

  1. SAP ABAP 中一些常用函数
  2. Qt 给应用程序添加图标
  3. 【开源】开发者新闻APP+新闻Restful服务+博客园新闻采集程序+infoq新闻采集程序+36kr新闻采集程序+oschina新闻采集程序+51cto新闻采集程序+csdn新闻采集程序...
  4. 【集合论】容斥原理 ( 包含排斥原理 | 示例 )
  5. 荣耀路由2 虚拟服务器,荣耀路由器2恢复出厂设置的两种方法
  6. 通信upf是什么意思_管理UPF的方法、装置及系统与流程
  7. java resin_resin启动问题
  8. centos安装宝塔跳过绑定手机号
  9. matlab 数据白化,数据白化
  10. oracle 新增字段 影响,Oracle 之 表新增字段后修改字段顺序
  11. python中--snip--是什么意思
  12. ios降级鸿蒙,ios14更新正式版能降级到ios13.7吗 苹果ios14怎么降级方法教程
  13. linux关闭计算机的命令是,关闭Linux计算机的命令操作
  14. 中小商业银行主动安全纵深防御体系解决方案
  15. 嵌入式应用市场四大热点及趋势
  16. 向华为、海尔学习为什么失败?
  17. 选择域名的基本准则以及注意事项
  18. C(X):vcruntime.h头文件
  19. 手机号码验证--区号验证--电话号验证--分机号验证--手机号和固定电话二选一--用户名只能为汉字或者英文请--邮箱账号...
  20. php计算距离高考还有多少天,高考倒计时软件2019 距离高考还有多少天

热门文章

  1. 计算机网络—PPP协议和HDLC协议
  2. OpenGL基础36:天空盒
  3. 牛客练习赛31: D. 神器大师泰兹瑞与威穆(链表)
  4. bzoj 4131: 并行博弈(博弈)
  5. 2017 ACM-ICPC乌鲁木齐网络赛 B. Out-out-control cars(几何)
  6. flink在k8s上的部署和使用教程
  7. jQuery Mobile中主题theme样式a-z
  8. (二)PyQt5基础学习
  9. theadClasses设置Bootstrap Table表头样式
  10. 【Git基础笔记】常用命令