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=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相关推荐
- codeforces24D(高斯消元)
每行之间有递推关系,一行之内有环形关系的转移 高斯消元解方程即可 直接进行高斯消元会超时 但是这个矩阵具有奇妙的性质:只有对角线和两侧有数 消元的次数非常少 单次操作可以看成是线性的 #include ...
- OI每周刷题记录——lrllrl
看这标题就知道我是模仿的hzwer大佬,远程%%% 大佬的OI经历让蒟蒻我深受感触,为了晚一些AFO本蒟蒻也得加油了 从高二上期第一周开始计数,每个星期天更一次,一直更到我AFO 如果这是我此生最后一 ...
最新文章
- c语言语系的命名风格和java系命名风格
- 70个NumPy分级练习:用Python一举搞定机器学习矩阵运算
- 使用GitList查看git修改记录
- 将一个Excel文件分隔成多个
- 机器人也是“艺术家”!上海世界移动大会聚焦5G时代
- python 对象销毁_python对象销毁实例(垃圾回收)
- 数据挖掘之聚类k-means
- Java String的intern
- php fastcgi,配置apache以fastcgi运行php
- python 下字符串格式时间比较
- 机器学习之开源库大总结
- C++ 深拷贝和浅拷贝std::move移动构造函数,移动赋值函数
- 转义字符'\r'在Python内置函数print()中的妙用
- [js]promise学习2
- 基于keras和tensorflow的yolo3物体检测
- ios8 关于定位的一些问题
- SMTP 发送邮件错误码和解决方法
- 网页制作的一些素材整理(一)
- idc服务器维护岗位,IDC运维工程师工作内容
- Java培训学习之Java开源软件的汇总
热门文章
- java.sql.SQLSyntaxErrorException: Table 'ph.tbl_user' doesn't exist
- 微软IT如何规划和构建的企业私有云基础设施
- Qt MSVC 2017 32bit 编译出现“error: C2131: 表达式的计算结果不是常数”错误
- Oracle11G数据泵expdp/impdp使用并行与压缩技术备份与恢复
- 阿里云服务器部署记录
- SDNU 1268.超超爱链表
- 蓝色基因超级计算机玩仙剑6,世界上最快的计算机——蓝色基因超级计算机
- python 中画球体_python – 有效地绘制许多球体
- 【Tomcat简介】
- [考试]20141027