CF24D Broken robot

题目背景

小小迪带你吃瓜

题目描述

给出一个 n×m 的矩阵区域,一个机器人初始在第 x 行第 y 列,每一步机器人会等概率 的选择停在原地,左移一步,右移一步,下移一步,如果机器人在边界则丌会往区域外移动, 问机器人到达最后一行的期望步数。

输入输出格式

输入格式:

第一行两个整数,分别表示 n 和 m。 第二行两个整数,分别表示 x 和 y

输出格式:

一个小数表示答案

输入输出样例

输入样例#1:

10 10
10 4

输出样例#1:

0.0000000000

输入样例#2:

10 14
5 14

输出样例#2:

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=0;bool f=0;char ch=' ';while(!isdigit(ch)){f|=(ch=='-'); ch=getchar();}while(isdigit(ch)){s=(s<<3)+(s<<1)+(ch^48); ch=getchar();}return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{if(x<0){putchar('-'); x=-x;}if(x<10){putchar(x+'0');    return;}write(x/10);putchar((x%10)+'0');return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=1005;
int X,Y;
double dp[N][N];
double a[N][N],b[N];
inline void Debug(int n)
{int i,j;for(i=1;i<=n;i++){for(j=1;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=1;i<=n;i++){double Div=a[i][i];a[i][i]/=Div; b[i]/=Div;if(i==n) break;a[i][i+1]/=Div;Div=a[i+1][i]/a[i][i];a[i+1][i]-=Div*a[i][i];a[i+1][i+1]-=Div*a[i][i+1];b[i+1]-=Div*b[i];}for(i=n-1;i>=1;i--) b[i]-=b[i+1]*a[i][i+1];
}
int main()
{int i,j,n,m;R(n); R(m); R(X); R(Y);for(i=1;i<=m;i++) dp[n][i]=0.;for(i=n-1;i>=X;i--){if(m!=1){a[1][1]=2./3.; a[1][2]=-1./3.; b[1]=1./3.*dp[i+1][1]+1.;}else{a[1][1]=1./2.; b[1]=1./2.*dp[i+1][1]+1;}for(j=2;j<m;j++){a[j][j]=3./4.; a[j][j-1]=-1./4.; a[j][j+1]=-1./4.; b[j]=1./4.*dp[i+1][j]+1.;}if(m>1){a[m][m]=2./3.; a[m][m-1]=-1./3.; b[m]=1./3.*dp[i+1][m]+1.;}Gauss(m);for(j=1;j<=m;j++) dp[i][j]=b[j];}printf("%.10lf\n",dp[X][Y]);return 0;
}
/*
input
10 10
10 4
output
0.0000000000input
10 14
5 14
output
18.0038068653input
2 1
1 1
output
2.0000000000
*/

View Code

 

转载于:https://www.cnblogs.com/gaojunonly1/p/10713754.html

codeforces24D相关推荐

  1. codeforces24D(高斯消元)

    每行之间有递推关系,一行之内有环形关系的转移 高斯消元解方程即可 直接进行高斯消元会超时 但是这个矩阵具有奇妙的性质:只有对角线和两侧有数 消元的次数非常少 单次操作可以看成是线性的 #include ...

  2. OI每周刷题记录——lrllrl

    看这标题就知道我是模仿的hzwer大佬,远程%%% 大佬的OI经历让蒟蒻我深受感触,为了晚一些AFO本蒟蒻也得加油了 从高二上期第一周开始计数,每个星期天更一次,一直更到我AFO 如果这是我此生最后一 ...

最新文章

  1. 刷爆技术圈的《知识图谱》终于补货了,最后 968 份,低至 2 折,抢完不补!...
  2. LVS学习笔记及总结(思维导图版)
  3. word2vec原理(五):skip-gram和CBOW模型代码实现
  4. 双向dcdc变换器simulink仿真_台达_OBC双向充电_HighEfficiency HighDensity GaNBased 6.6kW
  5. jQuery的属性操作
  6. 运行快捷指令无法连接服务器失败,快捷指令打不开怎么回事?iPhone快捷指令无法载入的解决办法...
  7. Android之网络调试adb tcpip
  8. 高等数学上-赵立军-北京大学出版社-题解-练习5.3
  9. 时间管理,从洗碗开始
  10. python正则表达式思考_Python正则表达式由浅入深(一)
  11. 体检套餐管理系统 C#
  12. 南京大学全国计算机考试时间,2019南京大学自主招生考试时间及科目
  13. 实时渲染3D动画创作大赛
  14. pdf转换成html后打印不清晰,图片转换成pdf后很模糊不清晰怎么办?
  15. MATLAB怎么做出三叶玫瑰线,《数学实验》期末总复习题
  16. html分享微信qq等,h5移动端调用微信好友,朋友圈,QQ好友,QQ空间等APP分享功能...
  17. oracle exists
  18. Linux写文件断电保存,硬盘写到一半时断电,文件系统里会发生什么?
  19. 海量数据处理 大量数据中找出最大的前10个数 (Top K 问题)
  20. 数据结构第二版(朱昌杰版)树

热门文章

  1. 大容量充电宝或成乘机“累赘”
  2. 电商大佬联手ERP厂商的背后故事(上个月就想写,一直没时动笔,终于:)
  3. CAD中如何识别CAD标高范围?
  4. 2021年T电梯修理考试试卷及T电梯修理证考试
  5. Centos更改yum源为阿里云镜像源
  6. 解决Discus!x3.1论坛安装插件提示无法运行通过zend加密应用
  7. PLC编程入门梯形图实例讲解
  8. 关于Abaqus+python提取s11残余应力(按路径提取)
  9. 7628刷breed_自制各类路由原厂直刷Breed的文件,无需修改mac无需重刷无线
  10. MATLAB数组乘方