Random Walk——高斯消元法
题目
有一个 $N \times M$ 大小的格子,从(0, 0)出发,每一步朝着上下左右4个格子中可以移动的格子等概率移动。另外有些格子有石头,因此无法移至这些格子。求第一次到达 $(N-1, M-1)$ 格子的期望步数。($2 \leq N,M\leq 10$)
分析
设 $E(x, y)$ 表示从 (x, y) 出发到终点的期望步数。
我们先考虑从 $(x, y)$ 向上下左右4个方向都可以移动的情况,由于向4个方向的移动的概率是相等的,因此可以建立如下关系:
$$
\begin{aligned}
E(x, y) & = \frac{1}{4}(E(x-1, y)+1) + \frac{1}{4}(E(x+1,y)+1) + \frac{1}{4}(E(x, y-1)+1) + \frac{1}{4}(E(x, y+1)+1)\\
&=\frac{1}{4}(E(x-1, y) + E(x+1, y) + E(x, y-1) + E(x, y+1)) + 1\\
\end{aligned}$$
如果移动不是等概率,只需要把 1/4 改成相应的数值就可以了。
如果存在不能移动的方向,我们也可以列出类似的式子。
为了使方程有唯一解,我们令有石头的格子和无法到达的格子都有 $E(x, y) = 0$。
把得到的 $N \times M$ 个方程联立,就可以解出期望步数。
#include<bits/stdc++.h>
using namespace std; const int maxn = +;
const int maxm = +;
char grid[maxn][maxm+];
int N, M; bool vis[maxn][maxm]; //can[x][y]为true表示(x, y)能够达到终点
const int dx[] = {-, , , };
const int dy[] = {, , , -}; //搜索可以达到终点的点
void dfs(int x, int y)
{
vis[x][y] = true;
for(int i = ;i < ;i++)
{
int nx = x + dx[i], ny = y + dy[i];
if(nx >= && nx <N && ny >= && ny < M && !vis[nx][ny])
if(grid[nx][ny] != '#') dfs(nx, ny);
}
} const double eps = 1e-;
typedef double Matrix[maxn*maxm][maxn*maxm]; //结果为A[i][n]/A[i][i]
void gauss_jordan(Matrix A, 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(fabs(A[r][i]) < eps) continue; //放弃这一行,直接处理下一行
if(r != i) for(j = ;j <= n;j++) swap(A[r][j], A[i][j]); //与除第i行外的其他行进行消元
for(k = ;k < n;k++) if(k != i)
for(j = n;j >= i;j--) A[k][j] -= A[k][i] / A[i][i] * A[i][j];
}
} void debug_print(Matrix A, int n)
{
for(int i = ;i < n;i++)
for(int j = ;j < n;j++)
printf("%f%c", A[i][j], j == n- ? '\n' : ' ');
} Matrix A; int main()
{
scanf("%d%d", &N, &M);
for(int i = ;i < N;i++)
{
char s[];
scanf("%s", s);
for(int j = ;j < M;j++) grid[i][j] = s[j];
} dfs(, ); //构建矩阵
for(int i = ;i < N;i++)
for(int j = ;j < M;j++)
{
if((i == N- && j == M-) || !vis[i][j]) //终点/无法到达的点,令期望步数为0
{
A[i*M + j][i*M + j] = ;
continue;
}
int move = ;
for(int k = ;k <;k++)
{
int nx = i + dx[k], ny = j + dy[k];
if(nx >= && nx < N && ny >= && ny < M && grid[nx][ny] == '.')
{
A[i*M + j][nx*M + ny] = -;
move++;
}
}
A[i*M + j][i*M + j] = A[i*M + j][N*M] = move;
} //debug_print(A, N*M+1); gauss_jordan(A, N*M); printf("%.8f\n", A[][N*M] / A[][]);
return ;
}
Random Walk——高斯消元法的更多相关文章
- 加入商品分类信息,考虑用户所处阶段的 图模型 推荐算法 Rws(random walk with stage)
场景: 一个新妈妈给刚出生的宝宝买用品,随着宝宝的长大,不同的阶段需要不同的物品. 这个场景中涉及到考虑用户所处阶段,给用户推荐物品的问题. 如果使用用户协同过滤,则需要根据购买记录,找到与用户处于同 ...
- 从Random Walk谈到Bacterial foraging optimization algorithm(BFOA),再谈到Ramdom Walk Graph Segmentation图分割算法
1. 从细菌的趋化性谈起 0x1:物质化学浓度梯度 类似于概率分布中概率密度的概念.在溶液中存在不同的浓度区域. 如放一颗糖在水盆里,糖慢慢溶于水,糖附近的水含糖量比远离糖的水含糖量要高,也就是糖附近 ...
- 醉汉随机行走/随机漫步问题(Random Walk Randomized Algorithm Python)
世界上有些问题看似是随机的(stochastic),没有规律可循,但很可能是人类还未发现和掌握这类事件的规律,所以说它们是随机发生的. 随机漫步(Random Walk)是一种解决随机问题的方法,它 ...
- HDU 4579 Random Walk (解方程组)
Random Walk Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others)Total ...
- HDU 4487 Maximum Random Walk
Maximum Random Walk Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- Python编程:从入门到实践 - matplotlib篇 - Random Walk
随机漫步 # random_walk.py 随机漫步 from random import choice class RandomWalk(): """一个生成随机漫步数 ...
- [论文阅读笔记] Community aware random walk for network embedding
[论文阅读笔记] Community aware random walk for network embedding 本文结构 解决问题 主要贡献 算法原理 参考文献 (1) 解决问题 先前许多算法都 ...
- Hill Climber and Random Walk
- 【HDOJ】4579 Random Walk
1. 题目描述一个人沿着一条长度为n个链行走,给出了每秒钟由i到j的概率($i,j \in [1,n]$).求从1开始走到n个时间的期望. 2. 基本思路显然是个DP.公式推导也相当容易.不妨设$dp ...
随机推荐
- Fineui alert去掉关闭按钮,去掉X
参考:http://fineui.com/bbs/forum.php?mod=viewthread&tid=7455&highlight=alert http:// ...
- WEUI Search Input回车键无法跳转解决
现象:回车键依然当前页面, window.location.href 设置无法起作用 增加 window.event.returnValue = false; 解决问题
- 洛谷P3984-数据结构 题解
题面 这题精,真的精 前言:不要被题目背景和描述误导! Solution: 题目大意 给定一段序列,请你做到区间修改和区间询问. 区间询问即 在 \(L\) 到 \(R\) 区间内,乘上下标后取模的值 ...
- C++分治策略实现快速排序
问题描述: 给定一个未知顺序的n个元素组成的数组,现要利用快速排序算法对这n个元素进行非递减排序. 细节须知: (1)代码实现了利用递归对数组进行快速排序,其中limit为从已有的随机数文件中输入的所 ...
- Tkint中Label&Button&Scale的使用
top.geometry()设定窗口的初始大小 scale.set()设定滑块的初始值 scale.get()获取滑块变化的值 控件通过回调函数与其他控件进行通信(Label控件中的文本会受到Scal ...
- quartz与c3p0冲突
在SSM中使用连接池c3p0正常,引入quartz后发现后台报错 java.lang.AbstractMethodError: Method com/mchange/v2/c3p0/impl/NewP ...
- 连续子数组的最大乘积及连续子数组的最大和(Java)
1. 子数组的最大和 输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.例如数组:arr[]={1, 2, 3, -2, ...
- Java 之 设计模式——代理模式
设计模式——代理模式 一.概述 1.代理模式 (1)真实对象:被代理的对象 (2)代理对象:代理真实对象的 (3)代理模式:代理对象代理真实对象,达到增强真实对象功能的目的 二.实现方式 1.静态代理 ...
- 创建Spring boot project报错:Project build error: Non-resolvable parent POM for xxx:0.0.1-SNAPSHOT: Could not transfer artifact org.springframework.boot:spring-boot-starter-parent
刚开始创建Spring boot项目时,pom.xml文件时报如下图错误: 在网上百度的说让更新下Maven的update project,我试了没用,最后将version版本改了就行了,我原来版本是 ...
- C语言判断字符串是否是 hex string的代码
把写内容过程中经常用到的一些内容段备份一下,如下内容内容是关于C语言判断字符串是否是 hex string的内容. { static unsigned int hex2bin[256]={0}; me ...