codeforces24D
CF24D Broken robot
题目背景
小小迪带你吃瓜
题目描述
给出一个 n×m 的矩阵区域,一个机器人初始在第 x 行第 y 列,每一步机器人会等概率 的选择停在原地,左移一步,右移一步,下移一步,如果机器人在边界则丌会往区域外移动, 问机器人到达最后一行的期望步数。
输入输出格式
输入格式:
第一行两个整数,分别表示 n 和 m。 第二行两个整数,分别表示 x 和 y
输出格式:
一个小数表示答案
输入输出样例
10 10
10 4
0.0000000000
10 14
5 14
18.0038068653 sol:肯定是dp辣,状态呼之欲出了,dp[i][j]表示从位置i,j到最后一行的期望步数
转移也十分容易(但是不能直接转移,因为是几个方程组,要用高斯消元解出来)
前面带-->表示这是用来消元的方程
dp[i][1]=1/3*(dp[i][1]+dp[i][2]+dp[i+1][1])+1 (1)
--> dp[i][1] - 1/3*dp[i][1] - 1/3*dp[i][2] = 1/3*dp[i+1][1]+1
dp[i][j]=1/4*(dp[i][j]+dp[i][j-1]+dp[i][j+1]+dp[i+1][j])+1 (2~m-1)
--> dp[i][j] - 1/4*dp[i][j] - 1/4*dp[i][j-1] - 1/4*dp[i][j+1] = 1/4*dp[i+1][j]+1
dp[i][m]=1/3*(dp[i][m]+dp[i][m-1]+dp[i+1][m])+1 (m)
--> dp[i][m]-1/3*dp[i][m]-1/3*dp[i][m-1] = 1/3*dp[i+1][m]+1
但是直接解是n3的,会T出屎,但是这个每行最多就3个不为0的系数,所以O(n)推过去,求出最后一个,在推回来即可
/*
dp[i][1]=1/3*(dp[i][1]+dp[i][2]+dp[i+1][1])+1 (1)
--> dp[i][1] - 1/3*dp[i][1] - 1/3*dp[i][2] = 1/3*dp[i+1][1]+1
dp[i][j]=1/4*(dp[i][j]+dp[i][j-1]+dp[i][j+1]+dp[i+1][j])+1 (2~m-1)
--> dp[i][j] - 1/4*dp[i][j] - 1/4*dp[i][j-1] - 1/4*dp[i][j+1] = 1/4*dp[i+1][j]+1
dp[i][m]=1/3*(dp[i][m]+dp[i][m-1]+dp[i+1][m])+1 (m)
--> dp[i][m]-1/3*dp[i][m]-1/3*dp[i][m-1] = 1/3*dp[i+1][m]+1
*/
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll s=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=;
int X,Y;
double dp[N][N];
double a[N][N],b[N];
inline void Debug(int n)
{
int i,j;
for(i=;i<=n;i++)
{
for(j=;j<=n;j++) printf("%.3lf ",a[i][j]);
printf("%.3lf\n",b[i]);
}
}
inline void Gauss(int n)
{
int i;
double Div;
// Debug(n);
for(i=;i<=n;i++)
{
double Div=a[i][i];
a[i][i]/=Div; b[i]/=Div;
if(i==n) break;
a[i][i+]/=Div;
Div=a[i+][i]/a[i][i];
a[i+][i]-=Div*a[i][i];
a[i+][i+]-=Div*a[i][i+];
b[i+]-=Div*b[i];
}
for(i=n-;i>=;i--) b[i]-=b[i+]*a[i][i+];
}
int main()
{
int i,j,n,m;
R(n); R(m); R(X); R(Y);
for(i=;i<=m;i++) dp[n][i]=.;
for(i=n-;i>=X;i--)
{
if(m!=)
{
a[][]=./.; a[][]=-./.; b[]=./.*dp[i+][]+.;
}
else
{
a[][]=./.; b[]=./.*dp[i+][]+;
}
for(j=;j<m;j++)
{
a[j][j]=./.; a[j][j-]=-./.; a[j][j+]=-./.; b[j]=./.*dp[i+][j]+.;
}
if(m>)
{
a[m][m]=./.; a[m][m-]=-./.; b[m]=./.*dp[i+][m]+.;
}
Gauss(m);
for(j=;j<=m;j++) dp[i][j]=b[j];
}
printf("%.10lf\n",dp[X][Y]);
return ;
}
/*
input
10 10
10 4
output
0.0000000000 input
10 14
5 14
output
18.0038068653 input
2 1
1 1
output
2.0000000000
*/
codeforces24D的更多相关文章
随机推荐
- Android自定义相机拍照并使用CardView展示
直接上完整代码:在Android Studio新建一个项目,然后依次创建: 1.预先在drawable文件夹中保存的图片资源 2.创建:CameraPreView.java类: 3.创建:OnClic ...
- 对称与非对称加密;SSL;HTTPS;AJP
1.对称加密就是加密与解密的时候都是用一个密码 2.非对称加密,有一对密码A,B:用A加密就得用B解密,相对的用B加密就得用A解密 3.公钥与私钥,这一对密码,随便拿一个公布出去,那个就是公钥,剩下一 ...
- 比较ASP.NET和ASP.NET Core[经典 Asp.Net v和 Asp.Net Core (Asp.Net Core MVC)]
ASP.NET Core是.与.Net Core FrameWork一起发布的ASP.NET 新版本,最初被称为ASP.NET vNext,有一系列的命名变化,ASP.NET 5.0,ASP.NET ...
- Really Big Numbers CodeForces - 817C (数学规律+二分)
C. Really Big Numbers time limit per test 1 second memory limit per test 256 megabytes input standar ...
- C#对摄像头的操作示例,采用Aforge库
操作摄像头有三个办法:VFW.DirectShow.花钱买第三方控件 VFW技术比较古老,无法解决驱动不完善造成的某些问题 DirectShow技术相对完善一些,但这是C++才能实现的技术.如果用.N ...
- 泛函p121可分Hilbert空间都同构于l^2
如何理解最后面两句话, L^2与l^2同构 L^2里面 有理系数多项式 是可数稠密子集 所以L^2可分 可分Hilbert空间都同构于 l^2 傅里叶级数是一个稠密的子集
- Git远程分支的回退
下午发现上午提交的一个版本有问题,在回退本地分支后,发现还必须要回退远程分支的版本.网上查找到的资料如下: #新建old_master分支做备份 git branch old_master #push ...
- django的配置文件字符串是怎么导入的?
写在开头: 每个APP都会有配置文件,像下代码Django等等这种的settings里面的配置导入都是字符串的,他们是怎么做的呢? MIDDLEWARE = [ 'django.middleware. ...
- JEECG & JEESite Tomcat集群 Session共享
多台tomcat服务的session共享 memcached与redis - JEECG开源社区 - CSDN博客https://blog.csdn.net/zhangdaiscott/article ...
- 常见的 CSRF、XSS、sql注入、DDOS流量攻击
CSRF攻击 :跨站请求伪造攻击 ,CSRF全名是Cross-site request forgery,是一种对网站的恶意利用,CSRF比XSS更具危险性 攻击者一般会使用吸引人的图片去引导用户点击进 ...