HDU4035 Maze (概率DP)
转:https://www.cnblogs.com/kuangbin/archive/2012/10/03/2711108.html
题意:
有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则无解...+
- /*
- HDU 4035
- dp求期望的题。
- 题意:
- 有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则无解...
- */
- #include<stdio.h>
- #include<string.h>
- #include<algorithm>
- #include<iostream>
- #include<math.h>
- #include<vector>
- using namespace std;
- const int MAXN=;
- const double eps=1e-;//这里1e-8会WA。设为1e-9和1e-10可以
- double k[MAXN],e[MAXN];
- double A[MAXN],B[MAXN],C[MAXN];
- vector<int>vec[MAXN];//存树
- bool dfs(int t,int pre)//t的根结点是pre
- {
- int m=vec[t].size();//点t的度
- A[t]=k[t];
- B[t]=(-k[t]-e[t])/m;
- C[t]=-k[t]-e[t];
- double tmp=;
- for(int i=;i<m;i++)
- {
- int v=vec[t][i];
- if(v==pre)continue;
- if(!dfs(v,t))return false;
- A[t]+=(-k[t]-e[t])/m*A[v];
- C[t]+=(-k[t]-e[t])/m*C[v];
- tmp+=(-k[t]-e[t])/m*B[v];
- }
- if(fabs(tmp-)<eps)return false;
- A[t]/=(-tmp);
- B[t]/=(-tmp);
- C[t]/=(-tmp);
- return true;
- }
- int main()
- {
- int T;
- int n;
- int u,v;
- int iCase=;
- scanf("%d",&T);
- while(T--)
- {
- iCase++;
- scanf("%d",&n);
- for(int i=;i<=n;i++)vec[i].clear();
- for(int i=;i<n;i++)
- {
- scanf("%d%d",&u,&v);
- vec[u].push_back(v);
- vec[v].push_back(u);
- }
- for(int i=;i<=n;i++)
- {
- scanf("%lf%lf",&k[i],&e[i]);
- k[i]/=;
- e[i]/=;
- }
- printf("Case %d: ",iCase);
- if(dfs(,-)&&fabs(-A[])>eps)
- {
- printf("%.6lf\n",C[]/(-A[]));
- }
- else printf("impossible\n");
- }
- }
HDU4035 Maze (概率DP)的更多相关文章
- hdu4035 Maze (树上dp求期望)
dp求期望的题. 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点1处(概率为ki) 2.找到出口,走出迷宫 ...
- HDU4035 Maze 期望DP+树形DP(好题)
题意:有一个树形的迷宫,有N个房间(标号为1~N)以及N-1条通道将它们连通,一开始在1号房间,每进入一个房间i,有k[i]的概率被陷阱杀死回到房间1,有s[i]的概率找到出口逃离迷宫,如果没有找到出 ...
- HDU 4035 Maze 概率dp,树形dp 难度:2
http://acm.hdu.edu.cn/showproblem.php?pid=4035 求步数期望,设E[i]为在编号为i的节点时还需要走的步数,father为dfs树中该节点的父节点,son为 ...
- hdu 4035 Maze 概率DP
题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点1处(概率为ki) ...
- hdu4035(概率dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4035 题意:有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结 ...
- HDU 4035 Maze 概率DP 搜索
解题报告链接: http://www.cnblogs.com/kuangbin/archive/2012/10/03/2711108.html 先推公式,设计状态,令DP[i]表示在房间i退出要走步数 ...
- HDU4035 Maze(期望DP)
题意 抄袭自https://www.cnblogs.com/Paul-Guderian/p/7624039.html 有n个房间,由n-1条隧道连通起来,形成一棵树,从结点1出发,开始走,在每个结点i ...
- A Dangerous Maze (II) LightOJ - 1395(概率dp)
A Dangerous Maze (II) LightOJ - 1395(概率dp) 这题是Light Oj 1027的加强版,1027那道是无记忆的. 题意: 有n扇门,每次你可以选择其中一扇.xi ...
- 【整理】简单的数学期望和概率DP
数学期望 P=Σ每一种状态*对应的概率. 因为不可能枚举完所有的状态,有时也不可能枚举完,比如抛硬币,有可能一直是正面,etc.在没有接触数学期望时看到数学期望的题可能会觉得很阔怕(因为我高中就是这么 ...
随机推荐
- java中java.util.Date和java.sql.Date之间的关系和使用选择
关系: java.util.Date是java.sql.Date的父类 区别:(java.sql.Date包含年月日信息,java.util.Date包含年月日时分秒) 1:“规范化”的java.sq ...
- python-backports.ssl-match-hostname 安装问题
转载请标明本文链接:(https://www.cnblogs.com/softwarecb/p/python-backports-ssl.html) 系统版本Ubuntu14.04 因为要用Conta ...
- 【SQL Server复制】数据库复制:修改表结构、新增表、新增存储过程 会被复制到订阅服务器?
转自:https://www.cnblogs.com/happyday56/p/3849018.html 关键字:sql server复制 [SQL Server高可用性]数据库复制:修改表结构.新增 ...
- [BNDSOJ] #1106代码
#include<bits/stdc++.h> using namespace std; ]; ][]; int n; bool check(int i,int j) { ]==]==]= ...
- Segment tree Beats
Segment tree Beats Segment tree Beats,吉司机线段树,主要是关于如何用线段树实现区间取min/max.我们先看一道例题: HDU5306 Gorgeous Sequ ...
- 使用pdfobject.js实现在线浏览PDF
1.pdfobject.js官网:https://pdfobject.com/ 2.在html文件中引入这个文件,以pdfobject.min.js为例 <script type="t ...
- MVC的view页面内嵌C#语法发现路径被转码的解决方法
一,上视图代码,如下 console.log('@urlquery.ToString()'); console.log('@Html.Raw(urlquery.ToString())'); 二,显示结 ...
- python实现不同条件下单据体的颜色不一样,比如直接成本分析表中关闭的细目显示为黄色
#引入clr运行库 import clr #添加对cloud插件开发的常用组件的引用 clr.AddReference('Kingdee.BOS') clr.AddReference('Kingdee ...
- 1144. The Missing Number (20)
Given N integers, you are supposed to find the smallest positive integer that is NOT in the given li ...
- jmeter中遇见的坑:url需要编码的
在postman中能请求成功,但是在jmeter就是请求失败报500错. 请求的 url :/graph/vertices?label=node&properties={"num& ...