题链:

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. 十款不容错过的Swift iOS开源项目及介绍

    1.十款不容错过的Swift iOS开源项目. http://www.csdn.net/article/2014-10-16/2822083-swift-ios-open-source-project ...

  2. 200行Python代码实现2048

    200行Python代码实现2048 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面 ...

  3. bzoj 4373 算术天才⑨与等差数列

    4373: 算术天才⑨与等差数列 Time Limit: 10 Sec  Memory Limit: 128 MBhttp://www.lydsy.com/JudgeOnline/problem.ph ...

  4. 深入浅出 SSL 管理配置实战

    我们生活在一个信息大爆炸的时代,几乎每天都在和互联网打交道,购物.网银转账.支付宝付款.搜索信息.查看邮件.观看视频.微信聊天.上网冲浪.阅读新闻等,无不时时刻刻在和网络打交道.那如何保护网络安全就相 ...

  5. php_类的定义

    此文章为原创见解,例子各方面也是东拼西凑.如果有错请留言.谢谢 在面向对象的思维中提出了两个概念,类和对象. 类是对某一类实物的抽象描述,而对象用于表示现实中该类事物的个体, 例子:老虎是父类,东北虎 ...

  6. Linq 对象的比较 Contains,Max

    IList<Student> studentList = new List<Student>() { new Student() { StudentID = 1, Studen ...

  7. 数据结构与算法 —— 链表linked list(03)

    继续关于linked list的算法题: 删除排序链表中的重复元素 给定一个排序链表,删除所有重复的元素使得每个元素只留下一个. 案例: 给定 1->1->2,返回 1->2 给定  ...

  8. 喜马拉雅音频下载工具 - xmlyfetcher

    xmlyfetcher用于下载喜马拉雅歌曲资源,可以下载单个音频资源,也可以下载整个专辑. 项目地址:https://github.com/smallmuou/xmlyfetcher 安装 安装jsh ...

  9. Beautifulsoup4

    kindEditor 1 官网:http://kindeditor.net/doc.php 2 文件夹说明: ├── asp asp示例 ├── asp.net asp.net示例 ├── attac ...

  10. Windows10 64位系统安装 .NET Framework 3.5

    1)下载NET Framework 3.5 [地址:https://pan.baidu.com/s/1c1FhXLY] 2)编辑NET Framework 3.5.bat ,修改sxs文件存放路径: ...