题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2262

  题意:LL在一个迷宫里面转,每次走向周围能走的点的概率都是一样的,现在LL要随机的走到canteen哪里,求期望。

  这个是带环的求期望问题,并且没有什么特殊性,只有列出方程,然后gauss消元了。首先用BFS求出能走的点,并判断能否走到canteen。然后列出期望方程,E[i]=Σ( E[j]*p[j] ) +1。然后好求了,注意题目中有多个canteen。。。

 //STATUS:C++_AC_437MS_700KB
#include <functional>
#include <algorithm>
#include <iostream>
//#include <ext/rope>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cstring>
#include <cassert>
#include <cstdio>
#include <string>
#include <vector>
#include <bitset>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <list>
#include <set>
#include <map>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,102400000")
//using namespace __gnu_cxx;
//define
#define pii pair<int,int>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define PI acos(-1.0)
//typedef
typedef __int64 LL;
typedef unsigned __int64 ULL;
//const
const int N=;
const int INF=0x3f3f3f3f;
const LL MOD=,STA=;
const LL LNF=1LL<<;
const double EPS=1e-;
const double OO=1e30;
const int dx[]={-,,,};
const int dy[]={,,,-};
const int day[]={,,,,,,,,,,,,};
//Daily Use ...
inline int sign(double x){return (x>EPS)-(x<-EPS);}
template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
template<class T> inline T lcm(T a,T b,T d){return a/d*b;}
template<class T> inline T Min(T a,T b){return a<b?a:b;}
template<class T> inline T Max(T a,T b){return a>b?a:b;}
template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);}
template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);}
template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));}
template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));}
//End /* gauss_elimination O(n^3)
n个方程n个变元
要求系数矩阵可逆
A[][]是增广矩阵,即A[i][n]是第i个方程右边的常数bi
运行结束后A[i][n]是第i个未知数的值 */
int vis[][],cnt[][],e[][];
char g[][];
int n,m,tot,sx,sy; double A[N][N]; int gauss(int n)
{
int i,j,k,r;
for(i=;i<n;i++){
//选一行与r与第i行交换,提高数据值的稳定性
r=i;
for(j=i+;j<n;j++)
if(fabs(A[j][i]) > fabs(A[r][i]))r=j;
if(r!=i)for(j=;j<=n;j++)swap(A[r][j],A[i][j]);
//i行与i+1~n行消元
/* for(k=i+1;k<n;k++){ //从小到大消元,中间变量f会有损失
double f=A[k][i]/A[i][i];
for(j=i;j<=n;j++)A[k][j]-=f*A[i][j];
}*/
for(j=n;j>=i;j--){ //从大到小消元,精度更高
for(k=i+;k<n;k++)
A[k][j]-=A[k][i]/A[i][i]*A[i][j];
}
}
//判断方程时候有解
for(i=;i<n;i++)if(sign(A[i][i])==)return ;
//回代过程
for(i=n-;i>=;i--){
for(j=i+;j<n;j++)
A[i][n]-=A[j][n]*A[i][j];
A[i][n]/=A[i][i];
}
return ;
} int bfs()
{
int i,j,x,y,nx,ny,t;
queue<int> q;
q.push(sx*m+sy);
mem(vis,-);mem(cnt,);
vis[sx][sy]=tot=;
tot++;
while(!q.empty()){
t=q.front();q.pop();
x=t/m;y=t%m;
for(i=;i<;i++){
nx=x+dx[i];
ny=y+dy[i];
if(nx>=&&nx<n && ny>=&&ny<m && g[nx][ny]!='#'){
cnt[x][y]++;
if(vis[nx][ny]!=-)continue;
vis[nx][ny]=tot++;
q.push(nx*m+ny);
}
}
}
for(i=;i<n;i++){
for(j=;j<m;j++)
if(vis[i][j]!=- && e[i][j])return ;
}
return ;
} int main(){
// freopen("in.txt","r",stdin);
int i,j,k;
while(~scanf("%d%d",&n,&m))
{
mem(e,);
for(i=;i<n;i++){
scanf("%s",g[i]);
for(j=;j<m;j++){
if(g[i][j]=='@')sx=i,sy=j;
else if(g[i][j]=='$')e[i][j]=;
}
} if(!bfs()){
printf("-1\n");
continue;
}
mem(A,);
for(i=;i<n;i++){
for(j=;j<m;j++){
if(vis[i][j]==-)continue;
int u=vis[i][j];
double p=1.0/cnt[i][j];
if(e[i][j]){
A[u][u]=;
A[u][tot]=;
continue;
}
A[u][u]=A[u][tot]=;
for(k=;k<;k++){
int x=i+dx[k],y=j+dy[k];
if(x>=&&x<n && y>=&&y<m && vis[x][y]!=-){
A[u][vis[x][y]]=-p;
}
}
}
}
gauss(tot);
printf("%.6lf\n",A[vis[sx][sy]][tot]);
}
return ;
}

HDU-2262 Where is the canteen 概率DP,高斯消元的更多相关文章

  1. 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 ...

  2. BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元

    BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元 题意: 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 3 ...

  3. LightOJ - 1151概率dp+高斯消元

    概率dp+高斯消元 https://vjudge.net/problem/LightOJ-1151 题意:刚开始在1,要走到100,每次走的距离1-6,超过100重来,有一些点可能有传送点,可以传送到 ...

  4. 【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元

    题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两 ...

  5. BZOJ3270 博物館 概率DP 高斯消元

    BZOJ3270 博物館 概率DP 高斯消元 @(XSY)[概率DP, 高斯消元] Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博 ...

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

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

  7. 【BZOJ3640】JC的小苹果 概率DP+高斯消元

    [BZOJ3640]JC的小苹果 Description 让我们继续JC和DZY的故事. “你是我的小丫小苹果,怎么爱你都不嫌多!” “点亮我生命的火,火火火火火!” 话说JC历经艰辛来到了城市B,但 ...

  8. 2016ACM/ICPC亚洲区沈阳站H - Guessing the Dice Roll HDU - 5955 ac自动机+概率dp+高斯消元

    http://acm.hdu.edu.cn/showproblem.php?pid=5955 题意:给你长度为l的n组数,每个数1-6,每次扔色子,问你每个串第一次被匹配的概率是多少 题解:先建成ac ...

  9. 【概率DP/高斯消元】BZOJ 2337:[HNOI2011]XOR和路径

    2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 682  Solved: 384[Submit][Stat ...

随机推荐

  1. Tomcat多次部署

    http://blog.csdn.net/knityster/article/details/6300804

  2. Google Code Style

    Google开源项目的代码遵循的规范,见这,C++, OC. PS: vim的配色编辑用户主目录下的.vimrc即可.

  3. Android ImageView(纯java)

    import android.app.Activity; import android.graphics.*; import android.graphics.drawable.*; import a ...

  4. 安装Ubuntu双系统系列——64位Ubuntu安装H3C的INode客户端

    学校使用的是Inode客户端认证上网的.如果是使用Ubuntu 32位版本,可以完美地安装并能够连接到网站.但是如果安装的是Ubuntu desktop 12.10 amd64版本,则发现之前的&qu ...

  5. Java API ——StringBuffer类

    1.StringBuffer类概述 1)我们如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间.而StringBuffer就可以解决这个问题 2)线程安全的可变字 ...

  6. HTML DOM与XML DOM之间,既有区别

    http://kb.cnblogs.com/page/74971/ HTML文档可以使用Core API和HTML API两者: 而XML文档只能使用Core API. 换句话说,HTML与XML重叠 ...

  7. NuGet相关的文章

    NuGet学习笔记(1)——初识NuGet及快速安装使用http://www.cnblogs.com/zhwl/p/3377510.html NuGet学习笔记(2) 使用图形化界面打包自己的类库ht ...

  8. C#中的Marshal

    Const.MaxLengthOfBufferd的长度固定为0x2000   也就是8192 private bool SendMessage(int messageType, string ip, ...

  9. java之内部类与匿名内部类

    Java 内部类 分四种:成员内部类.局部内部类.静态内部类和匿名内部类. 1.成员内部类: 即作为外部类的一个成员存在,与外部类的属性.方法并列. 注意:成员内部类中不能定义静态变量,但可以访问外部 ...

  10. bzoj1607: [Usaco2008 Dec]Patting Heads 轻拍牛头

    筛法. 枚举每个数,它会对它的倍数的答案有贡献. 数大了以后,倍数相应少了很多.比枚举每个数的约数要好的多. 自己yy了一种分步做法.小于sqrt(m)被当作约数枚举,大于sqrt(m)的枚举倍数. ...