『Broken Robot 后效性dp 高斯消元』
<更新提示>
<正文>
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\),简单做一下移项分类:
\]
同理,可以化简剩下两个方程:
\]
\]
那就可以写出系数矩阵了:
\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 高斯消元』的更多相关文章
- 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$ $ ...
- BZOJ 3270: 博物馆 [概率DP 高斯消元]
http://www.lydsy.com/JudgeOnline/problem.php?id=3270 题意:一张无向图,一开始两人分别在$x$和$y$,每一分钟在点$i$不走的概率为$p[i]$, ...
- BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元
BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元 题意: 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机 ...
- BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元
BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元 题意: 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 3 ...
- LightOJ - 1151概率dp+高斯消元
概率dp+高斯消元 https://vjudge.net/problem/LightOJ-1151 题意:刚开始在1,要走到100,每次走的距离1-6,超过100重来,有一些点可能有传送点,可以传送到 ...
- 【BZOJ3640】JC的小苹果 概率DP+高斯消元
[BZOJ3640]JC的小苹果 Description 让我们继续JC和DZY的故事. “你是我的小丫小苹果,怎么爱你都不嫌多!” “点亮我生命的火,火火火火火!” 话说JC历经艰辛来到了城市B,但 ...
- 【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元
题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两 ...
- BZOJ3270 博物館 概率DP 高斯消元
BZOJ3270 博物館 概率DP 高斯消元 @(XSY)[概率DP, 高斯消元] Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博 ...
- 【CF24D】Broken Robot (DP+高斯消元)
题目链接 题意:给定一个\(n\times m\)的矩阵,每次可以向→↓←移动一格,也可以原地不动,求从\((x,y)\)到最后一行的期望步数. 此题标签\(DP\) 看到上面这个肯定会想到 方法一: ...
随机推荐
- 打包工具webpack和热加载深入学习
本次小编呢,为大家带来一篇深入了解打包工具 webpack. 我们今天使用的是 webpack3.8.1版本的,我们学习使用 3.8.1更稳定些,并学习自己如何配置文件,最新版本不需要自己配置文件,但 ...
- Android源码分析(十二)-----Android源码中如何自定义TextView实现滚动效果
一:如何自定义TextView实现滚动效果 继承TextView基类 重写构造方法 修改isFocused()方法,获取焦点. /* * Copyright (C) 2015 The Android ...
- 面试官:优化代码中大量的if/else,你有什么方案?
一个快速迭代的项目,时间久了之后,代码中可能会充斥着大量的if/else,嵌套6.7层,一个函数几百行,简!直!看!死!人! 这个无限循环嵌套,只是总循环的一部分...我已经绕晕在黄桷湾立交 仔细数了 ...
- SSIS-WMI监视文件夹
在文档交互数据时,通常会排个job每隔几分钟执行来解析文档,但是jOb不能排的太频繁了,所以文档不能及时的被解析. 在SSIS中可以使用WMI这个组件来监视文件夹,一旦有新文档丢入就马上执行解析程序, ...
- OpenSSL 安装 (Linux系统)
OpenSSL 编译安装 操作系统:CentOS 7 OpenSSL Version: openssl-1.1.1d.tar.gz OpenSSL下载地址为:https://www.openssl.o ...
- Slf4j 打日志的问题 Exception 没有堆栈信息
Slf4j 打日志的问题 Exception 没有堆栈信息 发现线上环境有的Exception堆栈信息没打出来,只有异常信息没有堆栈信息,难以定位 一般情况下日志这么打 log.info(" ...
- xampp1.8.3 配置 php5.x 访问 SQL Server 2008
1.安装xampp 2.下载php sqlsrv扩展 Microsoft Drivers 3.2 for PHP for SQL Server 官方下载地址: http://www.microsoft ...
- 第三章 linux常用的命令
安装笔记: 1 安装linux操作系统时,会默认创建一个超级管理员帐号:root 2 安装时,当进行到选择哪种类型的安装时,我们选择"使用所有空间"的类型 Linux概念性的东西 ...
- node开发遇到类似:Error: ENOENT: no such file or directory, scandir 'D:\work\taro-components- ....... _node-sass@4.12.0@node-sass\vendor
唯一的有参考价值的文章,https://www.cnblogs.com/milo-wjh/p/9175138.html 我可以负责任的说,以下的方法, npm rebuild node-sass 80 ...
- 洛谷p1747好奇怪的游戏题解
题目 永远不要怀疑劳动人民的智慧! 把快读里最后的return直接返回零的 我已经不是第一次写错了! 我要是再写错我就****** 主要是逆向思维,把从两个点往(1, 1)走想成从(1, 1)点往这两 ...