<更新提示>


<正文>

Broken Robot

Description

你作为礼物收到一个非常聪明的机器人走在矩形板上。不幸的是,你明白它已经破碎并且行为相当奇怪(随机)。该板由N行和M列单元组成。机器人最初位于第i行和第j列的某个单元格中。然后在每一步,机器人都可以去另一个细胞。目的是走到最底层(N.排。机器人可以停留在当前单元格中,向左移动,向右移动或移动到当前单元格下方的单元格。如果机器人位于最左侧的列中,则它不能向左移动,如果它位于最右侧的列中,则它不能向右移动。在每一步中,所有可能的动作都是同样可能的。返回预期的步数以到达最下面一行。

Input Format

在第一行中你将被提供两个空间隔开的整数N和M(1≤N,M≤?1000)。在第二行中你将得到另外两个空间隔开的整数i和j(1≤i≤N,1≤j≤M) ——初始行的数目和初始列的数量。注意,(1,1)是板的左上角,(N, M)是右下角。

Output Format

在自身的一行上输出预期的步数,小数点后至少有4位数。

Sample Input

10 14
5 14

Sample Output

18.0038068653

解析

显然,这道题看起来很像一道期望\(dp\),那么我们就用期望\(dp\)的套路设一个状态试试:\(f[i][j]\)代表机器人从\((i,j)\)走到最后一行的步数期望值。

我们可以根据移动规则很容易列出\(dp\)方程:

\(1.\) 当机器人处于第一列时:\(f[i][1]=\frac{1}{3}(f[i][1]+f[i][2]+f[i+1][1])+1\)

\(2.\) 当机器人处于最后一列时:\(f[i][m]=\frac{1}{3}(f[i][m]+f[i][m-1]+f[i+1][m])+1\)

\(3.\) 当机器人处于中间列时:\(f[i][j]=\frac{1}{4}(f[i][j]+f[i][j-1]+f[i][j+1]+f[i+1][j])+1\)

我们发现,在行维度上,这个状态转移方程时没有问题的,可以倒序枚举每一行作为阶段,来进行转移。

但是,在同一行中,这个状态转移方程并不满足无后效性这一动态规划基本原则,于是我们决定使用高斯消元算法来解方程。

总体上,我们还是以行号为阶段,倒序进行转移。在第\(i\)行行内,我们将\(i+1\)行的状态看为常数,剩下的状态看做\(m\)个未知数,\(m\)个状态转移方程看做数学方程,尝试列出增广矩阵。

先看第一类方程:\(f[i][1]=\frac{1}{3}(f[i][1]+f[i][2]+f[i+1][1])+1\),简单做一下移项分类:

\[2f[i][1]-f[i][2]=f[i+1][1]+3
\]

同理,可以化简剩下两个方程:

\[-f[i][j-1]+3f[i][j]-f[i][j+1]=f[i+1][j]+4
\]

\[-f[i][m-1]+2f[i][m]=f[i+1][m]+3
\]

那就可以写出系数矩阵了:

\[\left[
\begin{array}{ccccccc|c}
2 & -1 & 0 & \cdots & 0 & 0 & 0 & f[i+1][1]+3 \\
-1 & 3 & -1 & \cdots & 0 & 0 & 0 & f[i+1][2]+4 \\
\vdots & \vdots & \vdots & \ddots & \vdots & \vdots & \vdots & \vdots \\
0 & 0 & 0 & \cdots& -1 & 3 & -1 & f[i+1][m-1]+4 \\
0 & 0 & 0 & \cdots& 0 & -1 & 2 & f[i+1][m]+3 \\
\end{array}
\right]
\]

我们发现这个矩阵很特殊,总共只有三条斜列有系数,所以我们可以线性直接消元。具体的说,我们可以从上往下消一遍,将第一斜列的系数消去,同时正确地处理第二第三斜列。再从下往上消一遍,将第三斜列的系数消去,这样就可以直接计算答案了。

利用如上的\(dp\)以及高斯消元算法,时间复杂度为\(O(nm)\)。

值得注意的是,这三个方程在\(m=1\)是会出现边界问题,简单推导可知\(m-1\)时答案就是\((n-x)*2\)。

\(Code:\)

#include <bits/stdc++.h>
using namespace std;
const int N = 1020;
int n,m,x,y;
double f[N][N],a[N][N],b[N];
inline void input(void)
{
scanf("%d%d\n%d%d",&n,&m,&x,&y);
}
inline void init(void)
{
a[1][1] = 2.0 , a[1][2] = -1.0;
for (int i=2;i<m;i++)
a[i][i-1] = -1.0 , a[i][i] = 3.0 , a[i][i+1] = -1.0;
a[m][m-1] = -1.0 , a[m][m] = 2.0;
}
inline void gauss(void)
{
double rate = a[2][1] / a[1][1];
a[2][1] = 0.0;
a[2][2] -= a[1][2] * rate , b[2] -= b[1] * rate;
for (int i=2;i<m;i++)
{
rate = a[i+1][i] / a[i][i];
a[i+1][i] = 0.0;
a[i+1][i+1] -= a[i][i+1] * rate , b[i+1] -= b[i] * rate;
}
for (int i=m-1;i>=1;i--)
{
rate = a[i][i+1] / a[i+1][i+1];
a[i][i+1] = 0.0 , b[i] -= b[i+1] * rate;
}
}
inline void dp(void)
{
for (int i=1;i<=m;i++)
f[n][i] = 0;
for (int i=n-1;i>=1;i--)
{
init();
b[1] = f[i+1][1] + 3.0;
for (int j=2;j<m;j++)
b[j] = f[i+1][j] + 4.0;
b[m] = f[i+1][m] + 3.0;
gauss();
for (int j=1;j<=m;j++)
f[i][j] = b[j] / a[j][j];
}
}
int main(void)
{
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
input();
if ( m != 1 ) dp();
else f[x][y] = ( n - x ) * 2.0;
printf("%.10lf\n",f[x][y]);
return 0;
}

<后记>

『Broken Robot 后效性dp 高斯消元』的更多相关文章

  1. CF24D Broken robot 后效性DP

    这题咕了好久..... 设$f[i][j]$表示从$(i,j)$到最后一行的期望步数: 则有 $ f[i][1]=\frac{1}{3}(f[i][1]+f[i][2]+f[i+1][1])+1$ $ ...

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

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

  3. BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元

    BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元 题意: 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机 ...

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

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

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

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

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

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

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

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

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

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

  9. 【CF24D】Broken Robot (DP+高斯消元)

    题目链接 题意:给定一个\(n\times m\)的矩阵,每次可以向→↓←移动一格,也可以原地不动,求从\((x,y)\)到最后一行的期望步数. 此题标签\(DP\) 看到上面这个肯定会想到 方法一: ...

随机推荐

  1. Windows 系统常用命令

    /** 环境变量配置 * sysdm.cpl */ /** 系统服务管理 * sservices.msc */ /** 远程服务器连接 * mstsc */ /** doc命令窗口 * doc */

  2. Odoo search 搜索视图详解与搜索视图工作原理

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826430.html 搜索视图 搜索视图的search标签本身没什么属性可以使用,只要是<searc ...

  3. 如何开启telnet服务LINUX&Windows

    一.LINUX centos 1.Linux安装telnet包 # yum install telnet* # rpm -qa |grep telnet telnet-server-0.17-47.e ...

  4. 对NetBackup 问题进行故障排除的步骤

    错误消息通常是指出哪里出现故障的手段.如果在界面上没有看到错误消息,但仍怀疑有问题,请检查报告和日志. NetBackup提供了各种报告和日志记录工具, 这些工具可提供错误消息,直接为您指出解决方案. ...

  5. Keras 训练一个单层全连接网络的线性回归模型

    1.准备环境,探索数据 import numpy as np from keras.models import Sequential from keras.layers import Dense im ...

  6. detectron2安装出现Kernel not compiled with GPU support 报错信息

    在安装使用detectron2的时候碰到Kernel not compiled with GPU support 问题,前后拖了好久都没解决,现总结一下以备以后查阅. 不想看心路历程的可以直接跳到最后 ...

  7. 《浅谈我眼中的express、koa和koa2》好文留存+笔记

    原文 :三英战豪强,思绪走四方.浅谈我眼中的express.koa和koa2 一.回调大坑怎么解决呢? 1.es5可以利用一下第三方库,例如 async 库, 2.或者单纯使用 connect中间件  ...

  8. JDOJ 2982: 最大连续子段和问题

    洛谷 P1115 最大子段和 洛谷传送门 JDOJ 2982: 最大连续子段和问题 JDOJ传送门 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入格式 第一行是一个正整数NN, ...

  9. 产品上线后,出现BUG的处理流程

    根据bug的大小,如果影响业务逻辑及用户提醒及时处理,如果只是一些状态.文案等等对业务无重大影响可以跟版本迭代走 很严重的bug必然要回滚,想都不要想赶紧去着手安排做. 检查回滚版本是否会丢失数据,如 ...

  10. CanvasRenderingContext2D.drawImage()无效,not working

    我的技术框架:react,如若不采用堵塞方式,即, const myimg = await loadImage(icon28) ctx.drawImage(myimg,0,0, 100, 100)   ...