【HDOJ6229】Wandering Robots(马尔科夫链,set)

题意:给定一个n*n的地图,上面有k个障碍点不能走,有一个机器人从(0,0)出发,每次等概率的不动或者往上下左右没有障碍的地方走动,问走无限步后停在图的右下部的概率

n<=1e4,k<=1e3

思路:据说是找规律

      From https://blog.csdn.net/anna__1997/article/details/78494788  牛逼的证明

   马尔科夫链的随机游走模型

  • 可建立状态转移矩阵,对n * n 的图中n * n 个点编号为0 ~[ (n - 1) * n + n – 1] 设最大编号为max
    P = p(i, j) = [p(0, 0) p(0, 1) … p(0, max)
    P(1, 0) p(1, 1) … p(1, max)

    P(max, 0) p(max, 1) … p(max, max)]
    π(i) 为i时间各点的概率
    π(n + 1) = π(n) * P
    当时间->无穷 π(n + 1)->π
    可以通过 π * P = π 计算
    验证猜测结果正确
    *******************************************************
    找规律的答案 有待证明
    现在能想到的是 整个封闭系统每个格子以出现机器人的概率作为权值 在很长的时间线上是一个熵增的
    过程(想到元胞自动机),如果要模拟这个概率扩散的过程的话,格子的权值的更新是一个用他所能到达的格子的权值
    和他自身的权值迭代的过程,这个过程中可以发现他的相邻的格子的权值是在不断同化的,因此,在无穷远后
    (0, 0)的和他周围的格子的权值不在体现优势,而更加开放的格子则更占优(可根据迭代公式理解)

    *******************************************************

    考虑每个障碍点对答案的影响,找规律后的得到只与障碍点所在的位置与周围的联通情况有关

    判格子是不是障碍可以用set

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<string>
     4 #include<cmath>
     5 #include<iostream>
     6 #include<algorithm>
     7 #include<map>
     8 #include<set>
     9 #include<queue>
    10 #include<vector>
    11 using namespace std;
    12 typedef long long ll;
    13 typedef unsigned int uint;
    14 typedef unsigned long long ull;
    15 typedef pair<int,int> PII;
    16 typedef vector<int> VI;
    17 #define fi first
    18 #define se second
    19 #define MP make_pair
    20 #define N   11000
    21 #define M   210
    22 #define MOD 1e9+7
    23 #define eps 1e-8
    24 #define pi acos(-1)
    25 int dx[]={0,-1,1,0,0},dy[]={0,0,0,-1,1};
    26 set<int>st;
    27
    28
    29 int read()
    30 {
    31    int v=0,f=1;
    32    char c=getchar();
    33    while(c<48||57<c) {if(c==‘-‘) f=-1; c=getchar();}
    34    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
    35    return v*f;
    36 }
    37
    38 int gcd(int x,int y)
    39 {
    40     if(y==0) return x;
    41     return gcd(y,x%y);
    42 }
    43
    44 int main()
    45 {
    46     //freopen("hdoj6229.in","r",stdin);
    47     //freopen("hdoj6299.out","w",stdout);
    48     int cas;
    49     scanf("%d",&cas);
    50     for(int v=1;v<=cas;v++)
    51     {
    52         st.clear();
    53         int n,m;
    54         scanf("%d%d",&n,&m);
    55         for(int i=1;i<=m;i++)
    56         {
    57             int x,y;
    58             scanf("%d%d",&x,&y);
    59             st.insert(x*N+y);
    60         }
    61         int s1=n*n*5-n*4;
    62         int s2=n*(n+1)/2*5-2*n-2;
    63         set<int>::iterator t=st.begin();
    64         while(t!=st.end())
    65         {
    66             int s=*t;
    67             int x=s/N;
    68             int y=s%N;
    69             for(int i=1;i<=4;i++)
    70             {
    71                 int tx=x+dx[i];
    72                 int ty=y+dy[i];
    73                 if(tx<0||tx>=n||ty<0||ty>=n||st.count(tx*N+ty)) continue;
    74                 s1--;
    75                 if(tx+ty>=n-1) s2--;
    76             }
    77
    78             if(x+y>=n-1)
    79             {
    80                 s2-=5;
    81                 if(x==0||x==n-1) s2++;
    82                 if(y==0||y==n-1) s2++;
    83             }
    84
    85             s1-=5;
    86             if(x==0||x==n-1) s1++;
    87             if(y==0||y==n-1) s1++;
    88              t++;
    89         }
    90
    91         int k=gcd(s1,s2);
    92         printf("Case #%d: %d/%d\n",v,s2/k,s1/k);
    93     }
    94     return 0;
    95 }
    96      

原文地址:https://www.cnblogs.com/myx12345/p/9748138.html

时间: 2024-10-06 06:43:56

【HDOJ6229】Wandering Robots(马尔科夫链,set)的相关文章

马尔科夫链和隐马尔可夫模型(转载)

马尔可夫模型是由Andrei A. Markov于1913年提出的 ?? 设 SS是一个由有限个状态组成的集合 S={1,2,3,-,n?1,n}S={1,2,3,-,n?1,n} 随机序列 XX 在 tt时刻所处的状态为 qtqt,其中 qt∈Sqt∈S,若有: P(qt=j|qt?1=i,qt?2=k,?)=P(qt=j|qt?1=i)P(qt=j|qt?1=i,qt?2=k,?)=P(qt=j|qt?1=i) aij≥0∑jnaij=1aij≥0∑jnaij=1 则随机序列 XX构成一个一

MCMC(二)马尔科夫链

MCMC(一)蒙特卡罗方法 MCMC(二)马尔科夫链 MCMC(三)M-H采样和Gibbs采样(待填坑) 在MCMC(一)蒙特卡罗方法中,我们讲到了如何用蒙特卡罗方法来随机模拟求解一些复杂的连续积分或者离散求和的方法,但是这个方法需要得到对应的概率分布的样本集,而想得到这样的样本集很困难.因此我们需要本篇讲到的马尔科夫链来帮忙. 1. 马尔科夫链概述 马尔科夫链定义本身比较简单,它假设某一时刻状态转移的概率只依赖于它的前一个状态.举个形象的比喻,假如每天的天气是一个状态的话,那个今天是不是晴天只

Chapter 4 马尔科夫链

4.1 引言 现在要研究的是这样一种过程: 表示在时刻的值(或者状态),想对一串连续时刻的值,比如:,, ... 建立一个概率模型. 最简单的模型就是:假设都是独立的随机变量,但是通常这种假设都是没什么根据的,也缺乏研究的意义. 举例来说的话,如果用来代替某个公司,比如Google,在个交易日之后的股票价格. 那么说第天的股票价格和之前第天,第天,第乃至第天的股票价格一点关系都没有,这样是说不过去的. 但是说第天股票的收盘价格依赖于第天的收盘价格还是有点道理的. 同样还可以做出这样的合理假设:在

马尔科夫链与蒙特卡洛方法采样算法

马尔科夫链 http://wenku.baidu.com/link?url=26MSlOhtBMPQJz3ta2p3bM6IMdLsvvHQ2mzw8AI2GcSdZAI7Ukdf1rl4KR6VUojnuutXwU5EqHNv-V0acHQn1PlkoyYT0j7DrVRWskg_Kr7&pn=50 蒙特卡洛采样算法 http://cos.name/2013/01/lda-math-mcmc-and-gibbs-sampling/ http://imbinwang.github.io/blog

利用隐马尔科夫链(HMM)模型实现中文分词

1.什么是HMM? 隐马尔科夫链(HMM)是一个五元组: 隐状态集合 ; 观测状态集合: 状态概率转移矩阵: 观察状态概率矩阵: 初始状态概率分布: 2.HMM有两个假设: 齐次马尔可夫链假设:任意时刻的隐藏状态只依赖与前一时刻的隐藏状态. 观测独立性假设:任意时刻的观察状态,只依赖与当前时刻的隐藏状态. 3.HMM可以解决3类基本问题: 评估观察序列的概率. 学习模型参数.即给定观察序列,估计模型的参数,是观察序列出现的概率最大. 预测问题.即给定观察序列和模型,求最有可能出现的对应状态序列.

13张动图助你彻底看懂马尔科夫链、PCA和条件概率!

https://mp.weixin.qq.com/s/ll2EX_Vyl6HA4qX07NyJbA [ 导读 ] 马尔科夫链.主成分分析以及条件概率等概念,是计算机学生必学的知识点,然而理论的抽象性往往让学生很难深入地去体会和理解.而本文,将这些抽象的理论概念,用可视化的方式来解释,还可调节相应参数来改变结果,使这些抽象概念变得生动而立体! 计算机相关概念太难.太抽象?别怕,往下看! 人类对视觉信息的记忆要远远大于文字信息.使用图表等形式的可视化,可以让抽象.难懂的概念一目了然:在此基础之上,添

马尔科夫链及其平稳状态

马尔科夫链的定义如下 从定义中我们不难看出马氏链当前状态只与前一个状态相关.比如我们预测明天天气,只考虑今天天气状况,不考虑昨天前天的天气状况. 举个具体的例子.社会学家把人按其经济状况分为3类:下层,中层,上层,我们用1,2,3表示这三个阶层.社会学家发现决定一个人的收入阶层最重要的因素就是其父母的收入阶层.如果一个人的收入属于下层类别,则它的孩子属于下层收入的概率为0.65,属于中层收入的概率为0.28,属于上层收入的概率为0.07.从父代到子代,收入阶层转移概率如下 我们用P表示这个转移矩

PyMC:马尔科夫链蒙特卡洛采样工具

PyMC是一个实现贝叶斯统计模型和马尔科夫链蒙塔卡洛采样工具拟合算法的Python库.PyMC的灵活性及可扩展性使得它能够适用于解决各种问题.除了包含核心采样功能,PyMC还包含了统计输出.绘图.拟合优度检验和收敛性诊断等方法. 加qq群813622576或vx;tanzhouyiwean免费领取Python学习资料 特性 PyMC使得贝叶斯分析尽可能更加容易.以下是一些PyMC库的特性: 用马尔科夫链蒙特卡洛算法和其他算法来拟合贝叶斯统计分析模型. 包含了大范围的常用统计分布. 尽可能地使用了

马尔科夫链

马尔科夫链定义本身比较简单,它假设某一时刻状态转移的概率只依赖于它的前一个状态.举个形象的比喻,假如每天的天气是一个状态的话,那个今天是不是晴天只依赖于昨天的天气,而和前天的天气没有任何关系.当然这么说可能有些武断,但是这样做可以大大简化模型的复杂度,因此马尔科夫链在很多时间序列模型中得到广泛的应用,比如循环神经网络RNN,隐式马尔科夫模型HMM等,当然MCMC也需要它. 原文地址:https://www.cnblogs.com/lansebandaoti/p/11343132.html