题目链接

题意:给定一个\(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. jmeter设置全局变量的方法

    需求: 同一个线程组内有两个http请求A.B,A请求的后置处理器中存储的有值,B请求中添加用户变量Va先要引用该值,然后B请求的前置处理器再引用用户变量va. 第一种方式: 1.A请求后置处理添加如 ...

  2. 微信营销 推广 会议签到 活动签到 复用微信3D动画签到系统

    适用场合 本软件适合各行各业,尤其世界500强上市公司,推广产品,聚集微信粉丝和人气.如大型展销会,新产品发布,主题活动推广,年会晚会等.各种商业和演出场合. 软件有试用版可供下载试用. 特色功能 顾 ...

  3. github 初始化操作小记

     Git作为一种越来越重要的工具,github又如此流行,现在就简单记录一下git的基础操作,希望能帮助大家快速体验入门! 1 查看本地是否存在”公钥”和”私钥” 如果没有,则执行: ssh-keyg ...

  4. 第二篇 Postman的高阶使用之配置全局变量及局部变量的调用及设置方法(手动方法)

    第五篇主要写了关于postman的基本使用,重点是如果发送json请求,为什么要将发送json请求呢, 一是目前大多数的请求已经倾向于发送json格式,二是本人太懒了,不想一个字段一个字段的添加到参数 ...

  5. cocos2d-x的坐标和节点层级

  6. Python Flask之旅

    <Pyhton Flask之旅> 以前学flask时做的总结,搬运到这里,markdown格式写的有点乱,凑合看吧. 参考博客 http://blog.csdn.net/nunchakus ...

  7. 九度OJ--Q1167

    import java.util.Scanner;import java.util.TreeSet; /* * 题目描述: * 输入一个数组的值,求出各个值从小到大排序后的次序. * 输入: * 输入 ...

  8. tensorflow学习笔记(1)-基本语法和前向传播

    tensorflow学习笔记(1) (1)tf中的图 图中就是一个计算图,一个计算过程.                                       图中的constant是个常量 计 ...

  9. mongolass 中报 ($.content: "say Hi ~") ✖ (type: String)

    第二次报这个错了, 一直以为MongoDB的模型用的type 是 String, 一直报错, 找不到原因. // 留言模型1 exports.Comment = mongolass.model('Co ...

  10. hadoop自定义数据类型

    统计某手机数据库的每个手机号的上行数据包数量和下行数据包数量 数据库类型如下: 数据库内容如下: 下面自定义类型SimLines,类似于平时编写的model import java.io.DataIn ...