D. Broken robot

链接

题意:

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

分析:

  因为不能往上走,所以行与行之间存在转移,即上一行转移到下一行。

  同一行内的位置可以互相转移,所以可以对每一行内进行高斯消元,那么复杂度是$O(n^4)$,但是发现高斯消元的矩阵中每行只有三个位置有数,这个矩阵叫三对角矩阵,观察这个矩阵,发现可以O(n)消元。复杂度$O(n^2)$

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int mod = , N = ;
const double f31 = 1.0 / 3.0, f32 = 2.0 / 3.0, f41 = 1.0 / 4.0, f43 = 3.0 / 4.0, f38 = 8.0 / 3.0, f23 = 3.0 / 2.0; double dp[N][N], a[N][N];
int n, m, x, y; int ksm(int a,int b) {
int res = ;
while (b) {
if (b & ) res = 1ll * res * a % mod;
a = 1ll * a * a % mod;
b >>= ;
}
return res;
} void Make(int i) {
a[][] = f32;
a[][] = -f31;
a[][m + ] = f31 * dp[i + ][] + ;
a[m][m - ] = -f31;
a[m][m] = f32;
a[m][m + ] = f31 * dp[i + ][m] + ;
for (int j = ; j < m; ++j) {
a[j][j - ] = -f41;
a[j][j + ] = -f41;
a[j][j] = f43;
a[j][m + ] = f41 * dp[i + ][j] + ;
}
}
void pr(int l,int r) {
for (int i = l; i <= r; ++i) {
for (int j = ; j <= m + ; ++j)
printf("% .2lf ", a[i][j]);
puts("");
}
puts("");
}
void solve(int i) {
a[][] = ; a[][] *= f23; a[][m + ] *= f23;
for (int j = ; j < m; ++j) {
a[j][j - ] = ;
a[j][j + ] /= (a[j][j] + f41 * a[j - ][j]);
a[j][m + ] += f41 * a[j - ][m + ];
a[j][m + ] /= (a[j][j] + f41 * a[j - ][j]);
a[j][j] = ;
}
a[m][m - ] = ;
a[m][m + ] += (f31 * a[m - ][m + ]);
a[m][m + ] /= (a[m][m] + f31 * a[m - ][m]);
a[m][m] = ; dp[i][m] = a[m][m + ];
for (int j = m - ; j >= ; --j)
dp[i][j] = a[j][m + ] - a[j][j + ] * dp[i][j + ];
}
int main() {
n = read(), m = read(), x = read(), y = read();
if (m == ) {
printf("%.10lf", 2.0 * (n - x)); return ;
}
for (int i = n - ; i >= x; --i) {
Make(i);
solve(i);
}
printf("%.10lf", dp[x][y]);
return ;
}

CF 24 D. Broken robot的更多相关文章

  1. Codeforces Beta Round #24 D. Broken robot (打表找规律)

    题目链接: 点击我打开链接 题目大意: 给你 \(n,j\),再给出 \(m[0]\) 的坐标和\(a[0]-a[n-1]\) 的坐标. 让你输出 \(m[j]\) 的坐标,其中 \(m[i]\) 和 ...

  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(期望+高斯消元)

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

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

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

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

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

  6. CF24D Broken robot

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

  7. CF 1073C Vasya and Robot(二分答案)

    C. Vasya and Robot time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  8. CF24D Broken robot 后效性DP

    这题咕了好久..... 设$f[i][j]$表示从$(i,j)$到最后一行的期望步数: 则有 $ f[i][1]=\frac{1}{3}(f[i][1]+f[i][2]+f[i+1][1])+1$ $ ...

  9. cf 24 Game (观察+.. 想一想)

    题意: 给一个数N,从1到N. 每次取两个数,三种操作:加.减.乘,运算完得一个数,把那俩数删了,把这个数加进去. 重复操作N-1次. 问是否可能得到24.若可以,输出每一步操作. 思路: 小于4,不 ...

随机推荐

  1. mongodb2.X添加权限

    1.连接mongodb数据库(如果mongo命令没有做环境变量配置,需要定位到有mongo命令的目录) root@AY140709212620347s22Z:~# mongo MongoDB shel ...

  2. 在 Azure 中将基础结构自动化工具与虚拟机配合使用

    若要以一致的方式大规模创建和管理 Azure 虚拟机 (VM),通常需要某种形式的自动化. 可以通过许多工具和解决方案来自动完成整个 Azure 基础结构部署和管理生命周期. 本文介绍了一些可以在 A ...

  3. Oracle EBS AR 客户API

    ------------------------------------ 1. Set Environment ------------------------------------ -- 1a. ...

  4. pong game using ncurses

    bounce2d2.c /* * bounce2d 1.0 * bounce a character (default is 'o') around the screen * defined by s ...

  5. python基础学习17----json&pickle&shelve

    json和pickle的功能是对数据进行序列化 将对象转换为可通过网络传输或可以存储到本地磁盘的数据格式(如:XML.JSON或特定格式的字节串)的过程称为序列化:反之,则称为反序列化 json模块 ...

  6. kettle性能优化

    普通开发电脑,如果没有网络查询步骤,kettle正常的速度应该在3000~20000条/秒.如果速度在2000条/秒一下,就可能需要调优. 性能优化的方式包括如下几种: 1.通过改变开始复制的数量(针 ...

  7. 51nod 1636 教育改革

    题目链接 令f[i][j][k]为第i天选择的课程为j,设置作业为a[j]+k时的最大作业量. 那么f[i][j][k]可以由哪些状态转移而来?先把课程按复杂度排序,那么可以转移来的课程是f[i-1] ...

  8. C++第七次作业

    关于计算器项目的总结: 一.就目前完成的计算器,包括界面的实现这部分,总体实现了简单计算的功能,但仍有很多不足之处: 需改进完善之处:1.关于界面可再优化: 2.界面放大时,无法自动聚焦(按钮等控件无 ...

  9. ip 报文头

  10. 死磕nginx系列-nginx日志配置

    nginx access日志配置 access_log日志配置 access_log用来定义日志级别,日志位置.语法如下: 日志级别: debug > info > notice > ...