题目链接

题意:给定一个\(n\times m\)的矩阵,每次可以向→↓←移动一格,也可以原地不动,求从\((x,y)\)到最后一行的期望步数。

此题标签\(DP\)

看到上面这个肯定会想到

方法一: \(f[i][j]\)表示表示从\((x,y)\)走到\((i,j)\)的期望步数,正推

方法二: \(f[i][j]\)表示从\((i,j)\)走到最后一行的期望步数,倒推

事实上,方法二更优秀。

因为如果用方法一,我们要求的答案就是\(\frac{\sum f[\text{最后一行}][\text{每个位置}]}{m}\)

而如果我们用方法二,答案就是\(f[x][y]\),省时又省力。

所以我们就用方法二。

然而上面两种方案都是有后效性的,因为\(f[i][j]\)取决与\(f[i-1][j](\text{或}f[i+1][j],f[i][j-1],f[i][j+1]\)甚至他本身,我们无法确定一个正确的递推顺序。

这时就要用\(DP\)套高斯消元了。

显然\(f[\text{最后一行}][\text{每个位置}]\)都为\(0\),于是枚举行,从\(n-1\)枚举到\(x\)。

先把状态转移方程写出来。

\(f[i][j]=\begin{cases}\ \frac{1}{3}(f[i][j]+f[i][j+1]+f[i+1][j])\ (j=1)\\ \frac{1}{4}(f[i][j-1]+f[i][j]+f[i][j+1]+f[i+1][j])\ (j!=1,j!=m)\\ \frac{1}{3}(f[i][j]+f[i][j-1]+f[i+1][j])\ (j=m)\end{cases}\)

可以发现,方程中\(f[i+1][j]\)固定出现,而这是我们已知的(最后一行均为\(0\),一行一行往上倒推),于是考虑移项。

以\(j=1\)为例,

\[f[i][j]=\frac{1}{3}(f[i][j]+f[i][j+1]+f[i+1][j])
\]

移项得

\[-\frac{1}{3}f[i+1][j]=\frac{1}{3}(-2f[i][j]+f[i][j+1]+f[i+1][j])
\]

于是我们便得到了\(m\)个一次方程,用高斯消元即可解出每一行所有的\(f\)值。

高斯消元理论复杂度\(O(n^3)\),但是我们仔细观察本题,每行事实上只有两个数需要消元,所以我们可以在\(O(m)\)的时间复杂度里完成高斯消元,算法总时间复杂度\(O(nm^2)\)。

#include <cstdio>
#include <cstdlib>
const int MAXN = 1010;
double f[MAXN][MAXN];
double M[MAXN][MAXN];
int n, m, x, y;
void Gauss(){ //高斯消元
for(int i = 1; i <= m; ++i){
double tmp = 1.0 / M[i][i]; //系数化一
M[i][i] *= tmp; M[i][m + 1] *= tmp;
if(i == m) break;
M[i][i + 1] *= tmp;
tmp = M[i + 1][i] / M[i][i]; //下一行消掉该元
M[i + 1][i] -= tmp * M[i][i]; M[i + 1][i + 1] -= tmp * M[i][i + 1]; M[i + 1][m + 1] -= tmp * M[i][m + 1];
}
for(int i = m - 1; i; --i) M[i][m + 1] -= M[i + 1][m + 1] * M[i][i + 1]; //回代
}
int main(){
scanf("%d%d%d%d", &n, &m, &x, &y);
for(int i = n - 1; i >= x; --i){
M[1][1] = -1.0 + 1.0 / 3; //
M[1][2] = 1.0 / 3;
for(int j = 2; j < m; ++j){
M[j][m + 1] = (-f[i + 1][j]) / 4.0 - 1;
M[j][j] = -1.0 + 1.0 / 4;
M[j][j - 1] = M[j][j + 1] = 1.0 / 4;
}
M[m][m] = -1.0 + 1.0 / 3;
M[m][m - 1] = 1.0 / 3;
if(m == 1) M[1][1] = -1.0 + 1.0 / 2;
M[1][m + 1] = (-f[i + 1][1]) / 3.0 - 1;
M[m][m + 1] = (-f[i + 1][m]) / 3.0 - 1; //构建矩阵
if(m == 1) M[m][m + 1] = (-f[i + 1][m]) / 2.0 - 1; //特判$m=1$的情况
Gauss();
for(int j = 1; j <= m; ++j)
f[i][j] = M[j][m + 1];
}
printf("%.10lf", f[x][y]);
return 0;
}

【CF24D】Broken Robot (DP+高斯消元)的更多相关文章

  1. $CF24D\ Broken Robot\ DP+$高斯消元

    Luogu Description 你收到的礼物是一个非常聪明的机器人,行走在一块长方形的木板上.不幸的是,你知道它是坏的,表现得相当奇怪(随机).该板由n行和m列的单元格组成.机器人最初是在i行和j ...

  2. codeforces 24d Broken robot 期望+高斯消元

    题目传送门 题意:在n*m的网格上,有一个机器人从(x,y)出发,每次等概率的向右.向左.向下走一步或者留在原地,在最左边时不能向右走,最右边时不能像左走.问走到最后一行的期望. 思路:显然倒着算期望 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. java线程池技术

    1.线程池的实现原理?简介: 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...

  2. python内置模块[re]

    python内置模块[re] re模块: python的re模块(Regular Expression正则表达式)提供各种正则表达式的匹配操作,在文本解析.复杂字符串分析和信息提取时是一个非常有用的工 ...

  3. 一步一步构建手机WebApp开发——环境搭建篇

    从2007年,乔布斯带来了第一代Iphone手机,整个移动互联网发生天翻地覆的变化,也同时证明了乔布斯的一句名言:“再一次改变世界”. 在当今的移动互联网,手机App居多,很多App对移动设备的要求也 ...

  4. 项目总结(一)->项目的七宗罪

    大半夜来这一份总结,心中夹杂着各种各样的心情,酸甜苦辣都有,今天为止,整个项目终于完结了,对于这样一个本可以正而八经吃吃薯片,看看毛片就可以完成项目,最后演变成一个一月之内连续加班105个小时的项目, ...

  5. Linux 文件与目录管理命令

    处理目录的常用命令 常见的处理目录的命令: ls: 列出目录 cd:切换目录 pwd:显示目前的目录 mkdir:创建一个新的目录,语法:mkdir [-mp] 目录名称 -m :配置文件的权限 -p ...

  6. virtualBox 安装 CentOs 6.8 以及网络配置

    安装 virtual box 基本设置: 1.创建虚拟电脑 类型:Linux 版本:Red Hat(64-bit) 这个64/32 和电脑具体配置关系. 然后就是路next or 设置常规的东西. 2 ...

  7. python中logging的常用方法

    logging常用 # -*- coding:utf-8 -*- __author__ = "lgj" import os import sys import time impor ...

  8. PTA实验报告(循环 数组 函数)

    一.循环PTA实验作业 题目一.7-2 求平方根序列前N项和 1.本题PTA提交列表 2.设计思路 本题调用了sqrt数学函数计算平方根,其次只用了一层循环,计算平方根之后使用循环累加计算总和sum. ...

  9. Centos7安装GUI桌面

    2018-03-02 21:37:48 Centos7-1708成功 yum -y groupinstall "GNOME Desktop"

  10. SQL Server 监测语句

    qs.creation_time, last_execution_time, total_physical_reads, total_logical_reads, total_logical_writ ...