Luogu

Description

你收到的礼物是一个非常聪明的机器人,行走在一块长方形的木板上.不幸的是,你知道它是坏的,表现得相当奇怪(随机).该板由n行和m列的单元格组成.机器人最初是在i行和j列的某个单元格上.然后在每一步机器人可以到另一个单元.目的是去底层(n次)行.机器人可以停留在当前单元,向左移动,向右边移动,或者移动到当前下方的单元.如果机器人在最左边的列不能向左移动,如果它是在最右边的列不能向右移动.在每一步中,所有可能的动作都是同样可能的.返回步的预期数量达到下面的行.

Sol

这题和传纸条有点类似,不同的是机器人既能向左走又能向右走,而传纸条只能向右传.

f[i][j]表示从(i,j)走到最后一行所需要的期望步数

f[i][1]=1/3(f[i][1]+f[i][2]+f[i+1][1])+1

f[i][m]=1/3(f[i][m]+f[i][m-1]+f[i+1][m])+1

(j!=1&&j!=m)f[i][j]=1/4(f[i][j]+f[i][j-1]+f[i][j+1]+f[i+1][j])+1

部分状态之间可以互相转移互相影响,并不能满足DP的无后效性

所以不能线性递推,要用高斯消元直接求出状态转移方程的解

需要注意的是m=1的情况要特判

m=3时,系数矩阵如下:

-2/3  1/3    0

1/4    1/4    1/4

0        1/3    -2/3

值得一提的是,我们用f[i][j]表示从(i,j)走到最后一步的期望步数,按照行号倒序进行递推,而不是用f[i][j]表示从(x,y)到(i,j)的期望步数并正序递推.原因是,若正序递推,则还须求出(x,y)到最后一行每一个位置的概率p[n][j],计算Σp[n][j]*f[n][j]才能得到答案,较为复杂.

事实上,很多数学期望DP都会采取倒推的方式执行.

Code

关于代码实现其实还有几个值得注意的地方

1.f[i][j]数组可以滚动优化

2.因为要多次解方程组,很多人可能会每次都初始化a数组(系数矩阵).其实没有必要,只要初始化一次,并且同时记录一下c[i]=a[i+1][i]/a[i][i]就好了(没写code这句话可能暂时看不懂,看下code就会懂了鸭QwQ)

 #include<iostream>
#include<cstdio>
#include<cstring>
#define Rg register
#define il inline
#define db double
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a));
#define go(i,a,b) for(Rg int i=a;i<=b;++i)
#define yes(i,a,b) for(Rg int i=a;i>=b;--i)
using namespace std;
il int read()
{
int x=,y=;char c=getchar();
while(c<''||c>''){if(c=='-')y=-;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
const int N=;
int n,m,x,y;
db a[N][N],b[N],f[N],c[N];
il void init_a()
{
if(m==){a[][]=(db)-1.0/;return;}
a[][]=(db)-2.0/;a[][]=(db)1.0/;
a[m][m-]=(db)1.0/;a[m][m]=(db)-2.0/;
go(i,,m-)a[i][i-]=(db)1.0/,a[i][i]=(db)-3.0/,a[i][i+]=(db)/;
go(i,,m)
{
c[i]=a[i+][i]/a[i][i];
a[i+][i]-=c[i]*a[i][i];
a[i+][i+]-=c[i]*a[i][i+];
}
}
il void init_b()
{
if(m==){b[]=(db)-f[]/-;return;}
b[]=-(db)f[]/-;b[m]=-(db)f[m]/-;
go(i,,m-)b[i]=-(db)f[i]/-;
}
il void calc()
{
go(i,,m){db t=c[i];b[i+]-=t*b[i];}
f[m]=b[m]/a[m][m];
yes(i,m-,)f[i]=(b[i]-f[i+]*a[i][i+])/a[i][i];
}
int main()
{
n=read(),m=read(),x=read(),y=read();//m==1 special case !
init_a();
yes(i,n-,x){init_b();calc();}
printf("%.10lf",f[y]);
return ;
}

$CF24D\ Broken Robot\ DP+$高斯消元的更多相关文章

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

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

  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. PHP header 的7种用法

    这篇文章介绍的内容是关于PHP header()的7种用法 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 PHP header 的7种用法 1. 跳转页面 header('Locat ...

  2. Javascript用正则表达式replace替换父串中所有符合条件的子串

    这样用,只会替换匹配到的第一个子串 str = 'I hava a pen ,I hava an apple,apple pen, pen apple' str = str.replace('appl ...

  3. Flask——向博客文章中添加图片

    未添加图片样式 添加图片设置: 1.允许渲染img标签 在数据库文章模型allowed_tags中添加img 2.给clean函数加个参数attributes=attrs, attrs = { '*' ...

  4. Python深入:01内存管理

            在Python中,一切都是指针. 一:对象三特性         所有的Python对象都有三个特性:身份,类型和值.         身份:每一个对象都有一个唯一的身份标识,任何对象 ...

  5. php实现第三方登录

    1. oAuth2.0原理 网站为了方便用户快速的登录系统,都会提供使用知名的第三方平台账号进行快速登录的功能,第三方登录都是基于oAuth2.0标准来实现的.下面详细分析[基于账号密码授权]和[基于 ...

  6. Linux 正文处理命令及tar命令 利用vi编辑器创建和编辑正文文件

    要点回顾 1) 将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) cp /etc/passwd . cat ./passwd >1.txt cp /etc/group ...

  7. Top 10 open source projects of 2015

    Top 10 open source projects of 2015 Posted 15 Dec 2015Jen Wike Huger (Red Hat)Feed 188 up 31 comment ...

  8. hdu 1708 Fibonacci String

    Fibonacci String Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...

  9. javaObject类

    所有类的公共父类,一旦一个类没有显示地继承一个类则其直接父类一定是Object. 一切数据类型都可用Object接收 class OOXX  extends Object{}等价于class ooXX ...

  10. [转]vue原理简介

    写vue也有一段时间了,对vue的底层原理虽然有一些了解,这里总结一下. vue.js中有两个核心功能:响应式数据绑定,组件系统.主流的mvc框架都实现了单向数据绑定,而双向绑定无非是在单向绑定基础上 ...