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. 讲解SQL数据库语句

    前言 大家好,我是 Vic,今天给大家带来讲解SQL数据库语句的概述,希望你们喜欢 数据库语句 create database teach; use teach; create table `teac ...

  2. Matlab中矩阵的数据结构

    在Matlab中,矩阵默认的数据类型是double, 并不是integer. 而且奇怪的是,矩阵乘法默认按照浮点数类型进行, 整数矩阵相乘会报错.另外,可以用a= int16(A)这种形式实现数据类型 ...

  3. 《挑战30天C++入门极限》C++类对象的复制-拷贝构造函数

        C++类对象的复制-拷贝构造函数 在学习这一章内容前我们已经学习过了类的构造函数和析构函数的相关知识,对于普通类型的对象来说,他们之间的复制是很简单的,例如: int a = 10; int ...

  4. Loadrunner录制+运行+结果-【飞机订票系统实战】

    目录结构: 一.LoadRunner实现订票系统脚本录制 二.Loadrunner实现订票系统IP欺骗(此处可以不设置) 三.Loadrunner运行录制的脚本 四.Load generator配置 ...

  5. Large Kernel Matters —— Improve Semantic Segmentation by Global Convolutional Network(GCN全局卷积网络)

    作者认为语义分割的两个挑战是分类和定位,而这两个挑战又是比较对立的.对于分类问题,模型需要有变形和旋转不变形,而对于定位问题,模型有需要对变形敏感. 提出的GCN遵循两个主要原则: 1.对定位问题,模 ...

  6. shell history 命令

    1.history命令可以显示历史执行过的命令: 2.使用!+序号执行该序号对应的命令: 例子 $ history sed 's/haha/hello/g' test cat test cat tes ...

  7. Android中活动的最佳实践(如何很快的看懂别人的代码activity)

    这种方法主要在你拿到别人的代码时候很多activity一时半会儿看不懂,用了这个方法以后就可以边实践操作就能够知道具体哪个activity是干什么用的 1.新建一个BaseActivity的类,让他继 ...

  8. svn服务备份与还原

    1.dump备份方式: svnadmin dump /data/svn/xxxx > /data/beifen/`date +/%Y%m%d`.bak xxxx:项目名称(项目库) 将xxxx这 ...

  9. winform如何不卡界面

    快速阅读 如何在winform程序中,让界面不再卡死. 关于委托和AsyncCallback的使用. 界面卡死的原因是因为耗时任务的计算占用了主线程,导致主界面没有办法进行其它操作,比如拖动.造成界面 ...

  10. Easytrader踩坑之旅(二)

    快速阅读 用的是THSTrader进行的调试,同花须必须用8.0的. 在新的机子重新安装requirements已经调用同花顺查股票余额. 继续昨天的话费. 昨天到最后,虽然显示了余额,但是和自己帐户 ...