CF 24 D. Broken robot
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的更多相关文章
- Codeforces Beta Round #24 D. Broken robot (打表找规律)
题目链接: 点击我打开链接 题目大意: 给你 \(n,j\),再给出 \(m[0]\) 的坐标和\(a[0]-a[n-1]\) 的坐标. 让你输出 \(m[j]\) 的坐标,其中 \(m[i]\) 和 ...
- CodeForces 24D Broken robot (概率DP)
D. Broken robot time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- CodeForces 24D Broken robot(期望+高斯消元)
CodeForces 24D Broken robot 大致题意:你有一个n行m列的矩形板,有一个机器人在开始在第i行第j列,它每一步会随机从可以选择的方案里任选一个(向下走一格,向左走一格,向右走一 ...
- 『Broken Robot 后效性dp 高斯消元』
Broken Robot Description 你作为礼物收到一个非常聪明的机器人走在矩形板上.不幸的是,你明白它已经破碎并且行为相当奇怪(随机).该板由N行和M列单元组成.机器人最初位于第i行和第 ...
- Broken robot CodeForces - 24D (概率DP)
You received as a gift a very clever robot walking on a rectangular board. Unfortunately, you unders ...
- CF24D Broken robot
题目链接 题意 有一个\(n \times m\)的矩阵.机器人从点\((x,y)\)开始等概率的往下,往右,往左走或者不动.如果再第一列,那么不会往左走,再第m列不会往右走.也就是说机器人不会走出这 ...
- CF 1073C Vasya and Robot(二分答案)
C. Vasya and Robot time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- 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$ $ ...
- cf 24 Game (观察+.. 想一想)
题意: 给一个数N,从1到N. 每次取两个数,三种操作:加.减.乘,运算完得一个数,把那俩数删了,把这个数加进去. 重复操作N-1次. 问是否可能得到24.若可以,输出每一步操作. 思路: 小于4,不 ...
随机推荐
- Jenkins 执行python脚本
操作很简单: * 最新版本的Jenkins,插件管理中下载两个python需要的插: * 重启Jenkins 任务中添加python脚本即可,点击保存时候,自动会在下图中目录生成.py文件 过程如下 ...
- Oracle EBS AP 取消付款
--取消付款 created by jenrry 20170425 declare l_return_status varchar2(50); l_msg_count number; l_msg_da ...
- Oracle EBS 银行账户API
创建银行 -- Create Bank DECLARE p_init_msg_list VARCHAR2(200); p_country_code VARCHAR2(200); p_bank_nam ...
- SQL 中常用存储过程xp_cmdshell运行cmd命令 (转载)
目的:使用SQL语句,在D盘创建一个文件夹myfile 首先查询系统配置 SELECT * FROM sys.configurations WHERE name='xp_cmdshell' OR na ...
- Linux load average负载量分析与解决思路
一.load average top命令中load average显示的是最近1分钟.5分钟和15分钟的系统平均负载.系统平均负载表示 系统平均负载被定义为在特定时间间隔内运行队列中(在CPU上运行或 ...
- 向Sql Server数据库插入中文时显示乱码的解决办法 (转)
转自:http://blog.csdn.net/wizardlun/article/details/4577658 參考:http://shareideas.blog.51cto.com/362642 ...
- [转]Java虚拟机是如何判断变量类型的
[原文]https://www.toutiao.com/i6591766777745637891/ 概述 众所周知,Java支持平台无关性.安全性和网络移动性.而Java平台由Java虚拟机和Java ...
- RSA 非对称加密,私钥转码为pkcs8 错误总结
RSA 非对称加密,私钥转码为pkcs8 错误总结 最近在和某上市公司对接金融方面的业务时,关于RSA对接过程中遇到了一个坑,特来分享下解决方案. 该上市公司简称为A公司,我们简称为B公司.A-B两家 ...
- 封装Ajax框架!(代码篇)
写在前面的话,如果中间有什么不明白的,请先看封装ajax框架!(前言篇) 1.添写一个封闭函数 (function(){})(); 在一个项目中,可能会引用多个js框架,如果函数名相同,会有命名冲突, ...
- Postman-断言和Runner
断言(部分) // 推荐用全等 ===,确保类型和值都一致 tests['Status code is 200'] = responseCode.code === 200; //判断响应结果是否是20 ...