【期望DP+高斯消元】BZOJ3270-博物馆
【题目大意】
有m条走廊连接的n间房间,并且满足可以从任何一间房间到任何一间别的房间。两个男孩现在分别处在a,b两个房间,每一分钟有Pi 的概率在这分钟内不去其他地方(即呆在房间不动),有1-Pi 的概率他会在相邻的房间中等可能的选择一间并沿着走廊过去。求两人在每间房间相遇的概率。
【思路】
向用链表把图建出来,建立的时候不要忘记了自己向自己再加一条边(见下面情况1)
我们将男孩A位于x,男孩B位于y的状态定义为id[x][y]。由id[tx][ty]状态转移到id[i][j]状态的概率。如果当前已经知道了抵达id[i][j]状态的期望概率为F[i,j]。
考虑以下几种可能性:
(1)tx=i且ty=j,说明两者都停留在原地不动,概率为Ptx*Pty*F[i,j];
(2)tx=i且ty≠j,说明男孩B移动了而男孩A没有,概率为Ptx*((1-Pty)/Dty)*F[i,ty],其中Dty为ty的出度;
(3)tx≠i且ty=j,概率为Pty*((1-Ptx)/Dtx)*F[tx,j];
(4)tx≠i且ty≠j,概率为((1-Ptx)/Dtx)*F[i,ty]*((1-Pty)/Dty)*F[tx,j]。
我们把F看成是未知数,它们前面乘上的看作是系数,对于F[i,j]可以列出以下方程:
F[i,j]=情况(1)+情况(2)+情况(3)+情况(4)。
0=(Ptx*Pty-1)*F[i,j]+情况(2)+情况(3)+情况(4)……(*)
如上 (*)式子总共可以列出n*n个。有一个特例是在其实位置,也就是F(a,b),由于一开始就位于id[a][b],也就是说初始时概率就为1了,所以在(*)右边还要加上1,移到等式左边就变成了-1,所以有a[id[aa][bb]][n*n+1]=-1。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
const int MAXN=+;
double f[MAXN*MAXN][MAXN*MAXN],p[MAXN];
int id[MAXN][MAXN];
vector<int> E[MAXN];
double a[MAXN*MAXN][MAXN*MAXN];
int n,m,aa,bb; void init()
{
scanf("%d%d%d%d",&n,&m,&aa,&bb);
int cnt=;
for (int i=;i<=n;i++)
for (int j=;j<=n;j++) id[i][j]=++cnt;
a[id[aa][bb]][n*n+]=-;
for (int i=;i<=n;i++) E[i].push_back(i);//不要忘记把自己向自己是可以走的
for (int i=;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
E[u].push_back(v);
E[v].push_back(u);
}
for (int i=;i<=n;i++) scanf("%lf",&p[i]);
} void buildequ()
{
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
{
a[id[i][j]][id[i][j]]--;//位于方程右边系数为1,移到左边系数变成-1
for (int x=;x<E[i].size();x++)
for (int y=;y<E[j].size();y++)
{
int tx=E[i][x],ty=E[j][y];
int fr=id[i][j],to=id[tx][ty];
if (tx!=ty)
{
if (tx==i && ty==j) a[fr][to]+=p[tx]*p[ty];//停留在原地不动
else if (tx==i) a[fr][to]+=p[tx]*(-p[ty])/(E[ty].size()-);
else if (ty==j) a[fr][to]+=p[ty]*(-p[tx])/(E[tx].size()-);
else a[fr][to]+=(-p[tx])*(-p[ty])/(E[ty].size()-)/(E[tx].size()-);
}
}
}
} void guass()
{
for (int i=;i<=n*n;i++)
{
int t=i;
for (int j=i+;j<=n*n;j++) if (fabs(a[j][i])>fabs(a[t][i])) t=j;
if (t!=i) for (int j=i;j<=n*n+;j++) swap(a[i][j],a[t][j]);//不要忘记要到n*n+1
for (int j=i+;j<=n*n;j++)
{
double x=a[j][i]/a[i][i];
for (int k=i;k<=n*n+;k++) a[j][k]-=a[i][k]*x;
}
}
for (int i=n*n;i>=;i--)
{
for (int j=i+;j<=n*n;j++) a[i][n*n+]-=a[i][j]*a[j][n*n+];
a[i][n*n+]/=a[i][i];
}
} void printans()
{
for (int i=;i<=n;i++) printf("%.6lf ",a[id[i][i]][n*n+]);
} int main()
{
init();
buildequ();
guass();
printans();
return ;
}
【期望DP+高斯消元】BZOJ3270-博物馆的更多相关文章
- BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元
BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元 题意: 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机 ...
- HDU 2262 Where is the canteen 期望dp+高斯消元
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2262 Where is the canteen Time Limit: 10000/5000 MS ...
- hdu4418 Time travel 【期望dp + 高斯消元】
题目链接 BZOJ4418 题解 题意:从一个序列上某一点开始沿一个方向走,走到头返回,每次走的步长各有概率,问走到一点的期望步数,或者无解 我们先将序列倍长形成循环序列,\(n = (N - 1) ...
- 【noi2019集训题1】 脑部进食 期望dp+高斯消元
题目大意:有n个点,m条有向边,每条边上有一个小写字母. 有一个人从1号点开始在这个图上随机游走,游走过程中他会按顺序记录下走过的边上的字符. 如果在某个时刻,他记录下的字符串中,存在一个子序列和S2 ...
- LightOJ 1151 Snakes and Ladders 期望dp+高斯消元
题目传送门 题目大意:10*10的地图,不过可以直接看成1*100的,从1出发,要到达100,每次走的步数用一个大小为6的骰子决定.地图上有很多个通道 A可以直接到B,不过A和B大小不确定 而且 ...
- P4457-[BJOI2018]治疗之雨【期望dp,高斯消元】
正题 题目链接:https://www.luogu.com.cn/problem/P4457 题目大意 开始一个人最大生命值为\(n\),剩余\(hp\)点生命,然后每个时刻如果生命值没有满那么有\( ...
- ZJUT 1423 地下迷宫(期望DP&高斯消元)
地下迷宫 Time Limit:1000MS Memory Limit:32768K Description: 由于山体滑坡,DK被困在了地下蜘蛛王国迷宫.为了抢在DH之前来到TFT,DK必须尽快走 ...
- Codeforces.24D.Broken robot(期望DP 高斯消元)
题目链接 可能这儿的会更易懂一些(表示不想再多写了). 令\(f[i][j]\)表示从\((i,j)\)到达最后一行的期望步数.那么有\(f[n][j]=0\). 若\(m=1\),答案是\(2(n- ...
- HDU4418 Time travel(期望dp 高斯消元)
题意 题目链接 Sol mdzz这题真的太恶心了.. 首先不难看出这就是个高斯消元解方程的板子题 \(f[x] = \sum_{i = 1}^n f[to(x + i)] * p[i] + ave\) ...
- [BZOJ3150][Ctsc2013]猴子 期望dp+高斯消元
3150: [Ctsc2013]猴子 Time Limit: 20 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 163 Solved: 10 ...
随机推荐
- bzoj 1084 DP
首先对于m==1的情况非常容易处理(其实这儿因为边界我错了好久...),直接DP就好了,设f[i][k]为这个矩阵前i个选k个矩阵的最大和,那么f[i][k]=max(f[j][k-1]+sum[j+ ...
- SQL SERVER 常用公式
SQL SERVER 获取当前月的天数 SELECT -DAY(getdate()+-DAY(getdate())) SQL server 除法计算百分比[整数乘1.0否则结果为0或1] CONVER ...
- Spring Boot:定制自己的starter
在学习Spring Boot的过程中,接触最多的就是starter.可以认为starter是一种服务——使得使用某个功能的开发者不需要关注各种依赖库的处理,不需要具体的配置信息,由Spring Boo ...
- Coursera在线学习---第七节.支持向量机(SVM)
一.代价函数 对比逻辑回归与支持向量机代价函数. cost1(z)=-log(1/(1+e-z)) cost0(z)=-log(1-1/(1+e-z)) 二.支持向量机中求解代价函数中的C值相当于 ...
- SQL注入之逗号拦截绕过
目前所知博主仅知的两个方法 1.通过case when then 2.join [一]case when then mysql,,,,,,, ) ) end; +----+-----------+-- ...
- mysql之基本数据库操作(二)
环境信息 数据库:mysql-5.7.20 操作系统:Ubuntu-16.04.3 mysql的启动.退出.重启 # 启动 $ sudo service mysqld start # 停止 $ sud ...
- EF添加ADO.NET实体模型处直接选择Oracle数据源
上一文介绍了如何下载Mysql for vs Tools来进行Mysql的ADO.NET实体模型数据源选择,今天将Oracle的测试了下.步骤如下: 1.在你项目Model层中nuget安装选中项 2 ...
- linux命令(17):pwd命令
1:查看当前工作目录的完整路径命令:pwd 2:目录连接链接时,pwd -P 显示出实际路径,而非使用连接(link)路径:pwd显示的是连接路径: [root@host-172-168-80-55 ...
- redis之(四)redis的字符串类型的命令
[一]获得符合规则的键名列表 -->命令 keys [pattern] -->keys命令需要遍历Redis中所有的键,当键的数量比较多会影响性能,生产环境不建议用 -->pat ...
- HDR文件格式简介及其读写函数
转自:http://blog.csdn.net/lqhbupt/article/details/7828827 1.HDR简介HDR的全称是High-DynamicRange(高动态范围).在此,我们 ...