题链:

http://www.lydsy.com/JudgeOnline/problem.php?id=3270
题解:

期望DP,高斯消元
本来是定义的关于概率的dp,
但是发现这样定义有很多解释不通的地方(比如概率怎么会大于1,是否初始位置的概率就为1……)
然后看了大佬博客,明白了定义关于期望的dp才是正确的(至少可以解释的得通上面的问题,233)

把两个人所在的位置看成一个2元组(i,j),这个2元组状态表示一个人在i号点,另一个人在j号点。
然后令dp[i,j]表示到达状态(i,j)的期望次数。
然后考虑转移:
对于一个点i,定义pi表示呆在原地的概率,cnti表示i点的出度,ti=(1-pi)/cnti表示前往一个与i点相连的点的概率。
那么$$dp[i,j]=pi*pj*dp[i,j]+\sum_{x->i,y->j}tx*pj*dp[x,j]+pi*ty*dp[i,y]+tx,ty*dp[x,y]$$
特别的:
1.形如dp[i,i]的状态不作为转移来源,因为到了(i,i)状态就结束了。
2.dp[X,Y]((X,Y)为起始状态)的来源还要多加上一个数值1,因为一开始就期望直接到了这个状态1次。
然后发现这个dp转移存在环,所以高斯消元,解出所有的dp值。

那么现在来了一个问题,题目要求的是概率,但是我们现在求出的却是期望???
显然此时在每个结束状态碰面的概率就等于每个状态的期望到达次数/期望和。
同时因为每当到达一个结束状态就会停下来,
所以所有的结束状态的dp值之和,也就是期望之和等于1(期望到达所以结束状态的次数为1)
那么每个结束状态的期望值在数值上就等于概率值啦。

代码:

#include<bits/stdc++.h>
#define MAXN 25
using namespace std;
double a[MAXN*MAXN][MAXN*MAXN],ans[MAXN*MAXN],p[MAXN];
double *A[MAXN*MAXN];
bool Edge[MAXN][MAXN];
int N,M,Ant,X,Y;
int idx(int i,int j){return (i-1)*N+j;}
void Gausselimination(int pos,int i){
if(pos==Ant+1||i==N*N+1) return;
for(int j=pos;j<=Ant;j++) if(A[j][i]!=0){
swap(A[pos],A[j]); break;
}
if(A[pos][i]!=0){
for(int j=pos+1;j<=Ant;j++){
double k=A[j][i]/A[pos][i];
for(int l=i;l<=N*N+1;l++)
A[j][l]-=A[pos][l]*k;
}
}
Gausselimination(pos+(A[pos][i]!=0),i+1);
if(A[pos][i]!=0){
for(int l=i+1;l<=N*N;l++) ans[i]+=ans[l]*A[pos][l];
ans[i]=A[pos][N*N+1]-ans[i];
ans[i]/=A[pos][i];
}
}
void buildequation(){
double pi,pj,tx,ty;
static int cnt[MAXN];
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
if(Edge[i][j]) cnt[i]++;
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++){
Ant++; pi=p[i]; pj=p[j];
a[Ant][idx(i,j)]=-1;
if(i==X&&j==Y) a[Ant][N*N+1]=-1;
if(i!=j) a[Ant][idx(i,j)]+=pi*pj;
for(int x=1;x<=N;x++) if(Edge[x][i]){
tx=(1-p[x])/cnt[x];
for(int y=1;y<=N;y++) if(Edge[y][j]){
ty=(1-p[y])/cnt[y];
if(i!=y) a[Ant][idx(i,y)]=pi*ty;
if(x!=j) a[Ant][idx(x,j)]=tx*pj;
if(x!=y) a[Ant][idx(x,y)]=tx*ty;
}
}
}
for(int i=1;i<=Ant;i++) A[i]=a[i];
}
int main(){
scanf("%d%d%d%d",&N,&M,&X,&Y);
for(int i=1,u,v;i<=M;i++)
scanf("%d%d",&u,&v),Edge[u][v]=Edge[v][u]=1;
for(int i=1;i<=N;i++) scanf("%lf",&p[i]);
buildequation();
Gausselimination(1,1);
for(int i=1;i<=N;i++) printf("%.6lf ",ans[idx(i,i)]);
return 0;
}

  

●BZOJ 3270 博物馆的更多相关文章

  1. BZOJ 3270: 博物馆

    Sol 期望DP+高斯消元. 根据本题题意列出期望方程\[E(i,j)=(1-p_i)(1-p_j)E(u,v)+(1-p_i)p_jE(u,j)+p_i(1-p_j)E(i,v)+p_ip_jE(i ...

  2. BZOJ 3270: 博物馆 [概率DP 高斯消元]

    http://www.lydsy.com/JudgeOnline/problem.php?id=3270 题意:一张无向图,一开始两人分别在$x$和$y$,每一分钟在点$i$不走的概率为$p[i]$, ...

  3. bzoj 3270 博物馆(高斯消元)

    [题意] 两人起始在s,t点,一人pi概率选择留在i点或等概率移动,问两人在每个房间相遇的概率. [思路] 把两个合并为一个状态,(a,b)表示两人所处的状态,设f[i]为两人处于i状态的概率.则有转 ...

  4. BZOJ 3270 博物馆 && CodeForces 113D. Museum 期望概率dp 高斯消元

    大前提,把两个点的组合看成一种状态 x 两种思路 O(n^7) f[x]表示在某一个点的前提下,这个状态经过那个点的概率,用相邻的点转移状态,高斯一波就好了 O(n^6) 想象成臭气弹,这个和那个的区 ...

  5. BZOJ 3270 博物馆 ——概率DP 高斯消元

    用$F(i,j)$表示A在i,B在j的概率. 然后很容易列出转移方程. 然后可以高斯消元了! 被一个问题困扰了很久,为什么起始点的概率要加上1. (因为其他博客上都是直接写成-1,雾) 考虑初始状态是 ...

  6. bzoj 3270: 博物馆【dp+高斯消元】

    好像是高斯消元解互相推(?)的dp的例子 首先考虑dp,设f[i][j]为一人在i一人在j的概率,点i答案显然就是f[i][i]: 然后根据题意,得到转移是 \[ f[i][j]=f[i][j]*p_ ...

  7. BZOJ 3270: 博物馆 概率与期望+高斯消元

    和游走挺像的,都是将概率转成期望出现的次数,然后拿高斯消元来解. #include <bits/stdc++.h> #define N 23 #define setIO(s) freope ...

  8. BZOJ 3270 && BZOJ 1778 (期望DP && 高斯消元)

    BZOJ 3270 :设置状态为Id(x,y)表示一人在x,一人在y这个状态的概率. 所以总共有n^2种状态. p[i]表示留在该点的概率,Out[i]=(1-p[i])/Degree[i]表示离开该 ...

  9. 「BZOJ 3270」博物馆「高斯消元」

    应该算高斯消元经典题了吧. 题意:一个无向连通图,有两个人分别在\(s,t\),若一个人在\(u\),每一分钟有\(p[u]\)的概率不动,否则随机前往一个相邻的结点,求在每个点相遇的概率 题解: 首 ...

随机推荐

  1. Beta冲刺Day7

    项目进展 李明皇 今天解决的进度 部分数据传递和使用逻辑测试 林翔 今天解决的进度 服务器端查看个人发布的action,修改已发布消息状态的action,仍在尝试使用第三方云存储功能保存图片 孙敏铭 ...

  2. 面试必问---HashMap原理分析

    一.HashMap的原理 众所周知,HashMap是用来存储Key-Value键值对的一种集合,这个键值对也叫做Entry,而每个Entry都是存储在数组当中,因此这个数组就是HashMap的主干.H ...

  3. js实现短暂提示框

    业务场景:当鼠标移入某元素时,显示提示框进行介绍.当鼠标移除时,会自动消失.引入ToolTip.js和ToolTip.css 主方法:ToolTip.show(需要提示的元素id, 随意不重复即可, ...

  4. vue.js+socket.io+express+mongodb打造在线聊天

    vue.js+socket.io+express+mongodb打造在线聊天 在线地址观看 http://www.chenleiming.com github地址 https://github.com ...

  5. js 防止重复点击

    1.添加flag 适用于ajax 表单提交,提交之前flag = false , 提及中,true ,提交后false 2.事件重复点击: <script> var throttle = ...

  6. 基于RNN的音频降噪算法 (附完整C代码)

    前几天无意间看到一个项目rnnoise. 项目地址: https://github.com/xiph/rnnoise 基于RNN的音频降噪算法. 采用的是 GRU/LSTM 模型. 阅读下训练代码,可 ...

  7. 第五章 JavaScript对象及初识面向对象

    第五章   JavaScript对象及初识面向对象 一.对象 在JavaScript中,所有事物都是对象,如字符串.数值.数组.函数等. 在JavaScript对象分为内置对象和自定义对象,要处理一些 ...

  8. zuul入门(1)zuul 的概念和原理

    一.zuul是什么 zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用. Zuul 在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架. ...

  9. Python 爬取淘宝商品信息和相应价格

    !只用于学习用途! plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"',html) :获得商品价格和view_pri ...

  10. IIFE的形式、原理和常见写法

    immediately invoked function expression 立即调用的函数表达式 出现的形式: 最近做牛客网的JS在线编程,遇到几道考闭包的题目,发现闭包的尾巴那儿经常会出现一对小 ...