●BZOJ 3270 博物馆
题链:
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 博物馆的更多相关文章
- 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 ...
- BZOJ 3270: 博物馆 [概率DP 高斯消元]
http://www.lydsy.com/JudgeOnline/problem.php?id=3270 题意:一张无向图,一开始两人分别在$x$和$y$,每一分钟在点$i$不走的概率为$p[i]$, ...
- bzoj 3270 博物馆(高斯消元)
[题意] 两人起始在s,t点,一人pi概率选择留在i点或等概率移动,问两人在每个房间相遇的概率. [思路] 把两个合并为一个状态,(a,b)表示两人所处的状态,设f[i]为两人处于i状态的概率.则有转 ...
- BZOJ 3270 博物馆 && CodeForces 113D. Museum 期望概率dp 高斯消元
大前提,把两个点的组合看成一种状态 x 两种思路 O(n^7) f[x]表示在某一个点的前提下,这个状态经过那个点的概率,用相邻的点转移状态,高斯一波就好了 O(n^6) 想象成臭气弹,这个和那个的区 ...
- BZOJ 3270 博物馆 ——概率DP 高斯消元
用$F(i,j)$表示A在i,B在j的概率. 然后很容易列出转移方程. 然后可以高斯消元了! 被一个问题困扰了很久,为什么起始点的概率要加上1. (因为其他博客上都是直接写成-1,雾) 考虑初始状态是 ...
- bzoj 3270: 博物馆【dp+高斯消元】
好像是高斯消元解互相推(?)的dp的例子 首先考虑dp,设f[i][j]为一人在i一人在j的概率,点i答案显然就是f[i][i]: 然后根据题意,得到转移是 \[ f[i][j]=f[i][j]*p_ ...
- BZOJ 3270: 博物馆 概率与期望+高斯消元
和游走挺像的,都是将概率转成期望出现的次数,然后拿高斯消元来解. #include <bits/stdc++.h> #define N 23 #define setIO(s) freope ...
- BZOJ 3270 && BZOJ 1778 (期望DP && 高斯消元)
BZOJ 3270 :设置状态为Id(x,y)表示一人在x,一人在y这个状态的概率. 所以总共有n^2种状态. p[i]表示留在该点的概率,Out[i]=(1-p[i])/Degree[i]表示离开该 ...
- 「BZOJ 3270」博物馆「高斯消元」
应该算高斯消元经典题了吧. 题意:一个无向连通图,有两个人分别在\(s,t\),若一个人在\(u\),每一分钟有\(p[u]\)的概率不动,否则随机前往一个相邻的结点,求在每个点相遇的概率 题解: 首 ...
随机推荐
- 解决python中flask_sqlalchemy包安装失败的问题
在进行flask_sqlalchemy包的下载安装时出现以下问题: 由图片可看出是编码转换出了问题,找到pip\compat_init_.py文件,打开它并查看第73行,将代码做如下更改并保存: 问题 ...
- 201621123040 《Java程序设计》第1周学习总结
1.本周学习总结 关键词 JAVA概述 HelloWorld JDK JRE JVM JAVA基础语法 相关联系 通过一周的学习,我对JAVA有了初步的了解,JAVA是一种优秀的跨平台编写代码的应用平 ...
- Struts2之Action的实现
对于Struts2框架来说,最重要的莫过于Action类的编写,类比于Servlet,Action类也是通过类的实例对象调用方法来处理请求的,Action类的实例对象是由Struts2的核心Filte ...
- JAVA_SE基础——15.循环嵌套
嵌套循环是指在一个循环语句的循环体中再定义一个循环语句结构,while,do-while,for循环语句都可以进行嵌套,并且可以互相嵌套,下面来看下for循环中嵌套for循环的例子. 如下: publ ...
- django处理cookie的机制
title: django处理cookie的机制 tags: djaogo, cookie, session grammar_cjkRuby: true --- cookie的意义 在多数日常使用的网 ...
- DES加密实现的思想及代码
感谢: http://blog.csdn.net/yxstars/article/details/38424021 上面的日志非常清晰的写出了这个DES加密的过程,主要存在初始IP置换,然后中间存在8 ...
- jupyter notebook下python2和python3共存(Ubuntu)
提示NOTICE 时间:2018/04/06 主题:Ubuntu 下CAFFE框架 主角:Jupyter Notebook 简介: Jupyter Notebook(此前被称为 IPython not ...
- Sudoku 第一步
看到这个问题的思路是先解决生成数独生成器的编写,然后再解决数独求解的问题.最开始第一想法就是暴力求解,仔细算一下复杂度,发现这肯定耗时很久,于是看了很多博客(见转载).我们用回溯搜出来正解.
- React 深入系列2:组件分类
文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列2:组件分类 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助大家加 ...
- python 单例模式的四种创建方式
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...