这题咕了好久.....


设$f[i][j]$表示从$(i,j)$到最后一行的期望步数;

则有

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

$ f[i][m]=\frac{1}{3}(f[i][m]+f[i][m-1]+f[i+1][m])+1$

$ f[i][j]=\frac{1}{4}(f[i][j]+f[i][j-1]+f[i][j+1]+f[i+1][j])+1$

所以他有后效性(于是我们疯狂迭代)

然而要高斯消元。。。。

具体的来说,就是把每行的每个转移都写在系数矩阵里,对这一行进行高斯消元;增广矩阵要写已知量;

化简上面的式子:

$\frac{2}{3}*f[i][1]-\frac{1}{3}*f[i][2]=\frac{1}{3}*f[i+1][1]+1 $

$\frac{2}{3}*f[i][m]-\frac{1}{3}*f[i][m-1]=\frac{1}{3}*f[i+1][m]+1$

$\frac{3}{4}*f[i][j]-\frac{1}{4}*f[i][j-1]-\frac{1}{4}*f[i][j+1]=\frac{1}{4}*f[i+1][j]+1$

注意,高斯消元消的是某一行,每个位置的值。

又注意到上面的有分数不美观,实际写的时候可以化简(方程两边同乘1个数)。

还有,高斯消元的过程需要简化

深蓝代表系数矩阵中有数的位置,浅灰蓝色为增广矩阵。

先消成这个样子:

然后从最后一行向上代入

#include<cstdio>
#include<iostream>
#define R register int
#define db double
using namespace std;
inline int g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
}
int n,m,x,y;
db f[],a[][];
inline void init() {
a[][]=,a[][]=-,a[][m+]=+f[];
a[m][m]=,a[m][m-]=-,a[m][m+]=+f[m];
for(R i=;i<m;++i) a[i][i]=,a[i][i-]=a[i][i+]=-,a[i][m+]=f[i]+;
}
inline void Gauss() {
for(R i=;i<=m;++i) { if(i<m) a[i][i+]/=a[i][i];
a[i][m+]/=a[i][i],a[i][i]=;
a[i+][i+]-=a[i][i+]*a[i+][i];
a[i+][m+]-=a[i][m+]*a[i+][i],a[i+][i]=;
} for(R i=m-;i;--i) a[i][m+]-=a[i][i+]*a[i+][m+];
for(R i=;i<=m;++i) f[i]=a[i][m+];
}
signed main() {
n=g(),m=g(),x=g(),y=g();
if(m==) printf("%.10lf\n",(db)*(n-x));
else { for(R i=n-;i>=x;--i) {
init(); Gauss();
} printf("%.10lf\n",f[y]);
}

2019.05.24

CF24D Broken robot 后效性DP的更多相关文章

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

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

  2. 【题解】CF24D Broken Robots(收敛性)

    [题解]CF24D Broken Robots http://codeforces.com/problemset/problem/24/D 解1(不会写,口胡的) 获得一个比较显然的转移式子 \(dp ...

  3. CF24D Broken robot

    题目链接 题意 有一个\(n \times m\)的矩阵.机器人从点\((x,y)\)开始等概率的往下,往右,往左走或者不动.如果再第一列,那么不会往左走,再第m列不会往右走.也就是说机器人不会走出这 ...

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

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

  5. Luogu P2973 [USACO10HOL]赶小猪Driving Out the Piggi 后效性DP

    有后效性的DP:$f[u]$表示到$u$的期望次数,$f[u]=\Sigma_{(u,v)} (1-\frac{p}{q})*f[v]*deg[v]$,最后答案就是$f[u]*p/q$ 刚开始$f[1 ...

  6. Cogs 376. [IOI2002]任务安排(后效性DP)

    [IOI2002]任务安排 ★☆ 输入文件:batch.in 输出文件:batch.out 简单对比 时间限制:1 s 内存限制:128 MB N个任务排成一个序列在一台机器上等待完成(顺序不得改变) ...

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

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

  8. cf24D. Broken robot(高斯消元)

    题意 题目链接 Sol 今天上午的A题.想出来怎么做了但是没时间写了qwq 思路很简单,首先把转移方程列一下,发现每一个位置只会从下一行/左右转移过来,而且第N行都是0,那么往下转移的都可以回带. 剩 ...

  9. 【CF24D】Broken Robot (DP+高斯消元)

    题目链接 题意:给定一个\(n\times m\)的矩阵,每次可以向→↓←移动一格,也可以原地不动,求从\((x,y)\)到最后一行的期望步数. 此题标签\(DP\) 看到上面这个肯定会想到 方法一: ...

随机推荐

  1. bzoj 3653: 谈笑风生 可持久化线段树

    题目大意 在一棵单位边权的有根树上支持询问: 给定a,k求满足下列条件的有序三元对的个数. a,b,c互不相同 a,b均为c的祖先 a,b树上距离<=k 题解 solution 1 首先我们知道 ...

  2. jquery--find与children方法的区别

      children方法: find方法: 通过以上的解释,可以总结如下: 1:children及find方法都用是用来获得element的子elements的,两者都不会返回 text node,就 ...

  3. windows下,CSV文件Excel打开乱码

    在windows下面,csv文件另存为UTF-8,在excel中打开中文是乱码,如果另存为utf-8 Big + BOM,Excel打开则是正常显示

  4. 洛谷【P1177】【模板】快速排序

    题目传送门:https://www.luogu.org/problemnew/show/P1177 快排是一种对于冒泡排序的优化. 对于区间\([l,r]\),我们选择一个键值\(k\),让比\(k\ ...

  5. UML核心元素--分析类

    分析类共有三个:边界类(boundary).控制类(control)和实体类(entity),这些分析类都是类的版型.分析类是跨越需求到设计实现的桥梁. 边界类:从需求向现实的转换过程中,任何两个有交 ...

  6. python 链表

    在C/C++中,通常采用“指针+结构体”来实现链表:而在Python中,则可以采用“引用+类”来实现链表. 节点类: class Node: def __init__(self, data): sel ...

  7. Entity Framework Code-First(9):DataAnnotations

    DataAnnotations in Code-First: EF Code-First provides a set of DataAnnotation attributes, which you ...

  8. 16.CTF综合靶机渗透(九)

    Boot2root challenges aim to create a safe environment where you can perform real-world penetration t ...

  9. Http客户端再封装

    Android系统上推荐的Http客户端从Apache变成[HttpURLConnection],主要理由包括 * 不过因为UrlConnection这组接口时间较早(Java 1.0), 接口的设计 ...

  10. python 里 np.array 的shape (2,)与(2,1)的分别是什么意思,区别是什么?

    numpy.ndarray.shap是返回一个数组维度的元组. (2,)与(2,1)的区别如下:   ndarray.shape:数组的维度.为一个表示数组在每个维度上大小的整数元组.例如二维数组中, ...