题意:n*m的棋盘,一个机器人在(i,j)处,每次等概率地停在原地,向左移动一格,向右移动一格,向下移动一格(不能移出棋盘).求走到最后一行所需期望步数.n<=1000,m<=1000

一个看起来可以用来DP的顺序是永远只能从上面走到下面,但同一行之间的转移会出现环.如果n和m的范围稍微小一点,我们可以像SDOI走迷宫一题跑一个分层的高斯消元,但这个题的范围比较大,会超时,但这道题的背景暗示我们列出来的方程组会比较规则,我们不妨先把方程列出来看看有什么特点.

设F[i][j]为从第i行第j列走到最后一行的期望步数

则有

F[i][1]=1+F[i][1]/3+F[i][2]/3+F[i+1]/3

F[i][j]=1+F[i][j]/4+F[i][j-1]/4+F[i][j+1]/4+F[i+1][j]/4,2<=j<=m-1

F[i][m]=1+F[i][m-1]/3+F[i+1][m]/3+F[i][m]/3

不妨仍考虑从第i+1行推到第i行.那么我们在求解F[i][1…m]的时候应当已经知道F[i+1][1…m],边界显然是F[n][j]=0

对于一行,有两个方程只有两个未知数,m-2个方程有三个未知数

如果两个方程里面是同两个未知数,我们可以直接解出这两个未知数,但现在F[i][1]和F[i][m]的未知数并不一定是同两个,我们可以考虑对这些式子进行变形.

F[i][1]的方程和F[i][1],F[i][2]有关,F[i][2]的方程和F[i][1],F[i][2],F[i][3]有关,那么我们可以用这两个方程消掉F[i][1],得到关于F[i][2]和F[i][3]的二元一次方程,接下来再和F[i][3]的方程相消,可以得到关于F[i][3]和F[i][4]的方程….最终我们就可以解出最右端的F[i][m],此后顺着推回来,复杂度O(n).

实现的时候我把每个二元一次方程表示成F[i][j]=a[j]*F[i][j+1]+b[j]的形式,比较容易理解.

转移的式子可能需要简单推一下,见代码.

注意m=1的情况要特判.

#include<cstdio>
double f[][];
double a[],b[];
int main(){
int n,m,x0,y0;scanf("%d%d%d%d",&n,&m,&x0,&y0);
if(m==){
a[n]=;
for(int i=n-;i>=x0;--i){
a[i]=a[i+]+;
}
printf("%.4f\n",a[x0]);
}else{
for(int i=;i<=m;++i)f[n][i]=;
for(int i=n-;i>=x0;--i){
a[]=0.5;b[]=f[i+][]/+1.5;
for(int j=;j<m;++j){
b[j]=b[j-]/4.0+f[i+][j]/4.0+1.0;
a[j]=0.25;
a[j]/=(0.75-a[j-]/4.0);b[j]/=(0.75-a[j-]/4.0);
}
f[i][m]=(b[m-]+f[i+][m]+3.0)/(-a[m-]);
for(int j=m-;j>=;--j)f[i][j]=b[j]+a[j]*f[i][j+];
}
printf("%.4f\n",f[x0][y0]);
}
return ;
}

CodeForces 24D Broken Robot的更多相关文章

  1. CodeForces 24D Broken robot(期望+高斯消元)

    CodeForces 24D Broken robot 大致题意:你有一个n行m列的矩形板,有一个机器人在开始在第i行第j列,它每一步会随机从可以选择的方案里任选一个(向下走一格,向左走一格,向右走一 ...

  2. CodeForces 24D Broken robot (概率DP)

    D. Broken robot time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  3. Codeforces.24D.Broken robot(期望DP 高斯消元)

    题目链接 可能这儿的会更易懂一些(表示不想再多写了). 令\(f[i][j]\)表示从\((i,j)\)到达最后一行的期望步数.那么有\(f[n][j]=0\). 若\(m=1\),答案是\(2(n- ...

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

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

  5. CF 24 D. Broken robot

    D. Broken robot 链接. 题意: 一个方格,从(x,y)出发,等价的概率向下,向左,向右,不动.如果在左右边缘上,那么等价的概率不动,向右/左,向下.走到最后一行即结束.求期望结束的步数 ...

  6. [Codeforces-div.1 24D] Broken robots

    [Codeforces-div.1 24D] Broken robots 试题分析 显然设\(f_{i,j}\)为到\((i,j)\)的期望步数,将转移表达式列出来. 首先自己跟自己的项消掉. 然后规 ...

  7. 『Broken Robot 后效性dp 高斯消元』

    Broken Robot Description 你作为礼物收到一个非常聪明的机器人走在矩形板上.不幸的是,你明白它已经破碎并且行为相当奇怪(随机).该板由N行和M列单元组成.机器人最初位于第i行和第 ...

  8. CodeForces 1251A --- Broken Keyboard

    [CodeForces 1251A --- Broken Keyboard ] Description Recently Polycarp noticed that some of the butto ...

  9. Broken robot CodeForces - 24D (概率DP)

    You received as a gift a very clever robot walking on a rectangular board. Unfortunately, you unders ...

随机推荐

  1. tomcat 504 gateway time-out

    今天有个环境ajax调用一个请求的时候,出现一个504 gateway time-out响应,原以为是nginx找不到资源的问题,恰当我们的服务器上又配置了nginx,看了配置文件,没有指向tomca ...

  2. HTML+CSS项目开发总结

    好几天没更新博客了,刚实战完一个HTML+CSS的简单项目.经过几天的摸索,发现收益良多.之前只是单纯得写demo,看知识点,没有亲自实战项目.但实战过后才会了解,如何才能更好地提升自己的技术.针对这 ...

  3. Centos7更改默认启动模式(转载)

    今天心血来潮安装一个centos7的图形界面,但发现用之前的方式无法修改默认启动为命令行模式. 之前的方法:修改/etc/inittab文件中的           id:3:initdefault ...

  4. android SQLite数据库总结

    SQLite SQLite是一种超轻量级的嵌入式数据库,大小只有几百KB,但是其语法支持标准SQL语法,同时还遵循了数据库的ACID事务,所以学过其他数据库的开发人员都很容易掌握其使用. sql语法就 ...

  5. iOS 隐藏状态栏

    1.整个项目隐藏状态栏 在Targets->General->勾选中Hide status bar . 整个项目隐藏状态栏 2.单个界面隐藏状态栏,例如登录注册页面 1.首先在info.p ...

  6. iOS 如何使用Safari浏览器打开app

    1.首先在info.plist添加一个键值对,如下图 或 2.在appdelegate.m文件如下方法写代码 -(BOOL)application:(UIApplication*)app openUR ...

  7. xUtils 3.0 post使用详解

    github:https://github.com/wyouflf/xUtils3 xUtils3简介 xUtils 包含了很多实用的android工具. xUtils 支持超大文件(超过2G)上传, ...

  8. Java 性能分析工具 , 第 3 部分: Java Mission Control

    引言 本文为 Java 性能分析工具系列文章第三篇,这里将介绍如何使用 Java 任务控制器 Java Mission Control 深入分析 Java 应用程序的性能,为程序开发人员在使用 Jav ...

  9. Unsupported major.minor version 51.0错误

    错误原因:用jdk7编译的class文件放到基于jdk6运行在tomcat之中,就会报这个错 解决方法:项目------>右键------>属性------>Java Compile ...

  10. loadrunner性能测试---添加windows多台压力机

    添加多台压力机 1.前置条件 1)保证压力机上都安装了loadrunner Agent,并启动,状态栏中会有小卫星.       2)添加的压力机与controller所在机器是否在同一个网段,建议关 ...