题链:

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. C语言第二次作业---分支结构

    一.PTA实验作业 题目1:计算分段函数[2] 1.实验代码 double x,y; scanf("%lf",&x); if(x>=0){ y=sqrt(x); } ...

  2. 微信小程序测试总结

    概述 由于项目中,微信前端和后端对接出现错误.所以Alpha测试分为微信小程序前端,管理员web测试. 测试工具选择 微信小程序的前端使用微信小程序开发工具测试. 管理员web使用web测试. 测试工 ...

  3. 同一个页面同时拥有collectionView和navigationBar和tabBar时可能遇到的问题

    写一个页面的时候,遇到了页面加载时候collectionView的最下面少了49个像素的位置,切换去别的页面之后,再返回,又变回正常,多方求解无果后,发现原来是系统自带的适应功能导致的,加入以下代码即 ...

  4. 乐动力APP案例

    第一部分 调研, 评测 下载软件并使用起来,描述最简单直观的个人第一次上手体验. 这款软件的主界面功能还是比较完善,里面有多个关于运动相关的数据,还有一些推荐健身教程,记录功能也十分不错,其中最难理解 ...

  5. 翻译:CREATE FUNCTION语句(已提交到MariaDB官方手册)

    本文为mariadb官方手册:CREATE FUNCTION的译文. 原文:https://mariadb.com/kb/en/library/create-function/我提交到MariaDB官 ...

  6. raid5 阵列硬盘离线数据恢复成功案例

    数据恢复故障描述: 某研究院 DELL 磁盘阵列崩溃,内置15块1TB硬盘搭建的RAID5阵列.一开始有一块硬盘离线,在更换新硬盘进行同步的过程中,第二块磁盘指示灯报警,同步失败,阵列无法正常工作. ...

  7. EasyUI datagrid 使用小结

    用了 EasyUI 框架一段时间了,这个前端框架用起来还是挺方便的,也有很多现成的控件,看看官方文档应该还是能比较快用起来的. 在这里记录一下一些常用的控件的方法,遇到过的bug或者当初耗了一点时间来 ...

  8. Column Addition~DP(脑子抽了,当时没有想到)

    Description A multi-digit column addition is a formula on adding two integers written like this:

  9. 常用cmd代码片段及.net core打包脚本分享

    bat基础命令 注释:rem 注释~~ 输出:echo hello world 接收用户输入:%1 %2,第n个变量就用%n表示 当前脚本路径:%~dp0 当前目录路径:%cd% 设置变量:set c ...

  10. Angular 学习笔记 (路由外传 - RouteReuseStrategy)

    refer : https://github.com/angular/angular/issues/10929 https://stackoverflow.com/questions/41280471 ...