Description

有一只坏了的机器人站在一个\(n\times m\)的网格里,初始位置在\((x,y)\)。现在每个单位时间内它会随机选左右下三个方向走,如果它随机的方向会走出网格就不会往这个方向走。当然这个机器人也可能原地停留一个单位时间。求机器人走到第\(n\)行的期望时间。

满足\(n,m\le 10^3,1\le x\le n,1\le y\le m\)。

Solution

考虑期望DP。

经过变换可使得\(x=1\)。

正着不好做,不妨倒过来,计算从最后一行任意位置到达\((1,y)\)的期望时间。设\(f_{x,y}\)是到达\((x,y)\)的期望时间。

不妨假设我们已经计算完了到达第\(i-1\)行每一个位置的期望时间\(f_{i-1,1},f_{i-1,2},\cdots,f_{i-1,m}\)。现在记\(x_1,x_2,\cdots,x_m\)为\(f_{i,1},f_{i,2},\cdots,f_{i,m}\),\(t_1,t_2,\cdots,t_m\)为\(f_{i-1,1},f_{i-1,2},\cdots,f_{i-1,m}\)。

容易列出状态转移方程:

\[\begin{cases}&x_1=\frac{1}{3}(x_1+x_2+t_1)+1\\&x_i=\frac{1}{4}(x_{i-1}+x_i+x_{i+1}+t_i)+1\;\;\;\;\;\;(1<i<m)\\&x_m=\frac{1}{3}(x_{m-1}+x_m+t_m)+1\end{cases}
\]

整理得:

\[\begin{cases}&2x_1-x_2=t_1+3\\&3x_i-x_{i-1}-x_{i+1}=t_i+4\;\;\;\;\;\;(1<i<m)\\&2x_m-x_{m-1}=t_m+3\end{cases}
\]

可以发现这个方程并没有办法直接DP。

所以不妨考虑解方程。将上述方程写成增广矩阵形式如下:

\[\left[\begin{array}{c|c}\begin{matrix}2 & -1\\-1 & 3 & -1\\& -1 & 3 & -1\\&& \cdots & \cdots & \cdots\\&&& -1 & 3 & -1\\&&&& -1 & 3 & -1\\&&&&& -1 & 2\end{matrix}&\begin{matrix}t_1+3\\t_2+4\\t_3+4\\\cdots\\t_{m-2}+4\\t_{m-1}+4\\t_m+3\end{matrix}\end{array}\right]
\]

逐行消元。假设我们已经消掉了第\(i-1\)行,要消第\(i\)行,矩阵局部如下:

\[\left[\begin{array}{c|c}\begin{matrix}1 & -A\\-1 & 3 & -1\end{matrix}&\begin{matrix}y_{i-1}\\y_i\end{matrix}\end{array}\right]
\]

两式相加得:

\[\left[\begin{array}{c|c}\begin{matrix}1 & -A\\& 3-A & -1\end{matrix}&\begin{matrix}y_{i-1}\\y_{i-1}+y_i\end{matrix}\end{array}\right]
\]

将主对角线上的数消成\(0\):

\[\left[\begin{array}{c|c}\begin{matrix}1 & -A\\& 1 & -\frac{1}{3-A}\end{matrix}&\begin{matrix}y_{i-1}\\\frac{y_{i-1}+y_i}{3-A}\end{matrix}\end{array}\right]
\]

我们就能得到迭代式\(A'=\frac{1}{3-A}\)。消元完成后反解回去即可。

处理完边界条件后,容易写出代码。

Code

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,x,y;
double A[1001],B[1001],F[1001][1001];
int main(){
scanf("%d%d%d%d",&n,&m,&x,&y);
n-=x-1;
if(m==1||m==2){printf("%d\n",(n-1)*(m+1));return 0;}
A[1]=0.5;
for(int i=2;i<m;i++)A[i]=1/(3-A[i-1]);
for(int i=n-1;i>=1;i--){
B[1]=(F[i+1][1]+3)/2;
for(int j=2;j<m;j++)B[j]=(B[j-1]+F[i+1][j]+4)*A[j];
F[i][m]=(B[m-1]+F[i+1][m]+3)/(2-A[m-1]);
for(int j=m-1;j>=1;j--)F[i][j]=B[j]+F[i][j+1]*A[j];
}
printf("%.10lf\n",F[1][y]);
}

[概率DP][消元法][CF24D]损坏的机器人的更多相关文章

  1. BZOJ 1415 [NOI2005]聪聪与可可 (概率DP+dfs)

    题目大意:给你一个无向联通图,节点数n<=1000.聪聪有一个机器人从C点出发向在M点的可可移动,去追赶并吃掉可可,在单位时间内,机器人会先朝离可可最近的节点移动1步,如果移动一步机器人并不能吃 ...

  2. 动态规划之经典数学期望和概率DP

    起因:在一场训练赛上.有这么一题没做出来. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6829 题目大意:有三个人,他们分别有\(X,Y,Z\)块钱 ...

  3. Codeforces 28C [概率DP]

    /* 大连热身D题 题意: 有n个人,m个浴室每个浴室有ai个喷头,每个人等概率得选择一个浴室. 每个浴室的人都在喷头前边排队,而且每个浴室内保证大家都尽可能均匀得在喷头后边排队. 求所有浴室中最长队 ...

  4. HDU 4405 Aeroplane chess (概率DP)

    题意:你从0开始,要跳到 n 这个位置,如果当前位置是一个飞行点,那么可以跳过去,要不然就只能掷骰子,问你要掷的次数数学期望,到达或者超过n. 析:概率DP,dp[i] 表示从 i  这个位置到达 n ...

  5. POJ 2096 Collecting Bugs (概率DP)

    题意:给定 n 类bug,和 s 个子系统,每天可以找出一个bug,求找出 n 类型的bug,并且 s 个都至少有一个的期望是多少. 析:应该是一个很简单的概率DP,dp[i][j] 表示已经从 j ...

  6. POJ 2151 Check the difficulty of problems (概率DP)

    题意:ACM比赛中,共M道题,T个队,pij表示第i队解出第j题的概率 ,求每队至少解出一题且冠军队至少解出N道题的概率. 析:概率DP,dp[i][j][k] 表示第 i 个队伍,前 j 个题,解出 ...

  7. 概率DP light oj 1030

    t组数据 n块黄金 到这里就捡起来 出发点1 到n结束  点+位置>n 重掷一次 dp[i] 代表到这里的概率 dp[i]=(dp[i-1]+dp[i-2]... )/6  如果满6个的话 否则 ...

  8. hdu 4050 2011北京赛区网络赛K 概率dp ***

    题目:给出1-n连续的方格,从0开始,每一个格子有4个状态,左右脚交替,向右跳,而且每一步的步长必须在给定的区间之内.当跳出n个格子或者没有格子可以跳的时候就结束了,求出游戏的期望步数 0:表示不能到 ...

  9. [转]概率DP总结 by kuangbin

    概率类题目一直比较弱,准备把kuangbin大师傅总结的这篇题刷一下! 我把下面的代码换成了自己的代码! 原文地址:http://www.cnblogs.com/kuangbin/archive/20 ...

随机推荐

  1. C语言指针的使用例子(1)指针地址的输出

    #include <stdio.h> int main(void) { int a=10; int *p = &a; *p = 89; printf("变量值a=%d a ...

  2. noi.ac #43 dp计数

    \(sol\) 状态 \[f_{i, dis_1, dis_2, dis_3, dis_4}\] 表示到了第 \(i\) 层,其中 \(dis_{1}\) 表示第一根柱子剩下的最靠上的横木到当前 \( ...

  3. 交互设计算法基础(2) - Selection Sort

    int[] selection_sort(int[] arr) { int i, j, min, temp, len=arr.length; for (i=0; i<len-1; i++) { ...

  4. (22)打鸡儿教你Vue.js

    vue.js 单页面,多页面 Vue cli工具 复杂单页面应用Vue cli工具 交互设计,逻辑设计,接口设计 代码实现,线上测试 git clone,git int 创建分支,推送分支,合并分支 ...

  5. BAT 定时将多个本地文件同步到共享目录

    copy.bat 具体执行脚本,需要修改共享目录访问用户名,密码,同步的文件类型 list.txt   前面为本地文件夹,后面为共享目录,中间以”,”进行分割 附件地址: https://files. ...

  6. CF1208题解

    C \(\begin{aligned}\ 0 0 1 1\\ 0 0 1 1\\ 2 2 3 3\\ 2 2 3 3\\ \end{aligned}\)将每个四方格分别加上\(0,4,8,12\) D ...

  7. [代码审计]PHP_Bugs题目总结(1)

    0x00 简介 最近这几天看到了许多关于代码审计的ctf题,在电脑里也翻出来好长时间没看过的php_bugs,干脆最近把这个好好看看! 下载地址:https://github.com/bowu678/ ...

  8. 【mybatis源码学习】与spring整合Mapper接口执行原理

    一.重要的接口 org.mybatis.spring.mapper.MapperFactoryBean MapperScannerConfigurer会向spring中注册该bean,一个mapper ...

  9. android -------- java.net.UnknownServiceException

    最近升级了Android的API版本时 ,导致我的网络请求失败了, 出现了这个错误 java.net.UnknownServiceException, 这个错误,我在网上查到这个主要是由于,我们的Ok ...

  10. Linux 操作系统 & High Tech

    分享10大白帽黑客专用的 Linux 操作系统 - 51CTO.COMhttp://os.51cto.com/art/201905/597156.htm Ubuntu 创始人谈论为什么 Linux 在 ...