题面在这里

题意

给定一个\(n\times m\)的格网,从\((1,1)\)出发,每一格\((i,j)\)往上下左右移动的概率已经给出,询问到达\((n,m)\)的期望步数

数据范围

\[n,m\le40
\]

sol

列方程高斯消元求解是显然的

\[E_{i,j}=1+p1_{i,j}\times E_{i+1,j}+p2_{i,j}\times E_{i,j+1}+p3_{i,j}\times E_{i-1,j}+p4_{i,j}\times E_{i,j-1}
\]

但是直接套高斯消元复杂度为\(O(n^3m^3)\),会\(TLE\)

于是考虑优化

因为每项方程的系数只有\(4\)个,可以知道最后得到的矩阵满足一定的规律

比如当\(n=4,m=3\)时,系数矩阵如下

\[\left[
\begin{matrix}
1&-p2_{1,1}&0&0&-p1_{1,1}&0&0&0&0&0&0&0\\
-p4_{1,2}&1&-p2_{1,2}&0&0&-p1_{1,2}&0&0&0&0&0&0\\
0&-p4_{1,3}&1&-p2_{1,3}&0&0&-p1_{1,3}&0&0&0&0&0\\
0&0&-p4_{1,4}&1&0&0&0&-p1_{1,4}&0&0&0&0\\
-p3_{2,1}&0&0&0&1&-p2_{2,1}&0&0&-p1_{2,1}&0&0&0\\
0&-p3_{2,2}&0&0&-p4_{2,2}&1&-p2_{2,2}&0&-p1_{2,2}&0&0&0\\
0&0&-p3_{2,3}&0&0&-p4_{2,3}&1&-p2_{2,3}&0&-p1_{2,3}&0\\
0&0&0&-p3_{2,4}&0&0&-p4_{2,4}&1&-p2_{2,4}&0&-p1_{2,4}\\
0&0&0&0&-p3_{3,1}&0&0&0&1&-p2_{3,1}&0&0\\
0&0&0&0&0&-p3_{3,2}&0&0&-p4_{3,2}&1&-p2_{3,2}&0\\
0&0&0&0&0&0&-p3_{3,3}&0&0&-p4_{3,3}&1&-p2_{3,3}\\
0&0&0&0&0&0&0&0&0&0&0&1\\
\end{matrix}
\right]\times
\left[
\begin{matrix}
E_{1,1}\\
E_{1,2}\\
E_{1,3}\\
E_{1,4}\\
E_{2,1}\\
E_{2,2}\\
E_{2,3}\\
E_{2,4}\\
E_{3,1}\\
E_{3,2}\\
E_{3,3}\\
E_{3,4}\\
\end{matrix}
\right]=
\left[
\begin{matrix}
1\\
1\\
1\\
1\\
1\\
1\\
1\\
1\\
1\\
1\\
1\\
0\\
\end{matrix}
\right]
\]

(建议缩小屏幕后食用)

在这个矩阵中,每行的系数都占据了\((2m+1)\)的长度,且以\(f_{i,i}\)为中心

因此我们在高斯消元的时候,只需要消除后\(m\)行中的\(m\)个系数

枚举每一行是\(O(nm)\)的,因此总复杂度即为\(O(nm^3)\)

于是就可以过了......

代码

#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cstring>
#include<complex>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define mp make_pair
#define pb push_back
#define RG register
#define il inline
using namespace std;
typedef unsigned long long ull;
typedef vector<int>VI;
typedef long long ll;
typedef double dd;
const dd eps=1e-10;
const int mod=1e9+7;
const int N=40;
const int M=50010*2;
il ll read(){
RG ll data=0,w=1;RG char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch<='9'&&ch>='0')data=data*10+ch-48,ch=getchar();
return data*w;
} il void file(){
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
} int n,m;
dd p[5][N+10][N+10],g[N*N+10][N*N+10]; il void gauss(int nm){
for(RG int i=1;i<=nm;i++){
for(RG int j=i;j<=min(nm,i+m);j++)
if(g[j][i]>eps){swap(g[i],g[j]);break;}
for(RG int j=i+1;j<=min(nm,i+m);j++){
g[j][nm+1]-=g[i][nm+1]*g[j][i]/g[i][i];
for(RG int k=min(nm,i+m);k>=i;k--)
g[j][k]-=g[i][k]*g[j][i]/g[i][i];
}
}
for(RG int i=nm;i;i--){
for(RG int j=i+1;j<=min(nm,i+m);j++)
g[i][nm+1]-=g[j][nm+1]*g[i][j];
g[i][nm+1]/=g[i][i];
}
} int main()
{
while(1){
n=read();m=read();if(!n)return 0;
for(RG int k=1;k<=4;k++)
for(RG int i=1;i<=n;i++)
for(RG int j=1;j<=m;j++)
scanf("%lf",&p[k][i][j]); for(RG int i=1;i<=n*m;i++)
for(RG int j=1;j<=n*m+1;j++)
g[i][j]=0; for(RG int i=1;i<=n;i++)
for(RG int j=1;j<=m;j++){
RG int x=(i-1)*m+j;g[x][x]=g[x][n*m+1]=1;
if(i<n)g[x][i*m+j]=-p[1][i][j];
if(j<m)g[x][(i-1)*m+j+1]=-p[2][i][j];
if(i>1)g[x][(i-2)*m+j]=-p[3][i][j];
if(j>1)g[x][(i-1)*m+j-1]=-p[4][i][j];
g[x][n*m+1]=1;
}
g[n*m][(n-1)*m]=g[n*m][n*m-1]=0;g[n*m][n*m+1]=0; gauss(n*m);
printf("%.6lf\n",g[1][n*m+1]);
}
return 0;
}

[UVAlive4297]First Knight的更多相关文章

  1. POJ2488A Knight's Journey[DFS]

    A Knight's Journey Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 41936   Accepted: 14 ...

  2. Knight Moves

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  3. HDU 1372 Knight Moves

    最近在学习广搜  这道题同样是一道简单广搜题=0= 题意:(百度复制粘贴0.0) 题意:给出骑士的骑士位置和目标位置,计算骑士要走多少步 思路:首先要做这道题必须要理解国际象棋中骑士的走法,国际象棋中 ...

  4. [宽度优先搜索] HDU 1372 Knight Moves

    Knight Moves Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tot ...

  5. HDU 1372 Knight Moves (bfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1372 Knight Moves Time Limit: 2000/1000 MS (Java/Othe ...

  6. POJ2488-A Knight's Journey(DFS+回溯)

    题目链接:http://poj.org/problem?id=2488 A Knight's Journey Time Limit: 1000MS   Memory Limit: 65536K Tot ...

  7. UVA 439 Knight Moves --DFS or BFS

    简单搜索,我这里用的是dfs,由于棋盘只有8x8这么大,于是想到dfs应该可以过,后来由于边界的问题,TLE了,改了边界才AC. 这道题的收获就是知道了有些时候dfs没有特定的边界的时候要自己设置一个 ...

  8. 【POJ 2243】Knight Moves

    题 Description A friend of you is doing research on the Traveling Knight Problem (TKP) where you are ...

  9. hdu Knight Moves

    这道题实到bfs的题目,很简单,不过搜索的方向变成8个而已,对于不会下象棋的会有点晕. #include <iostream> #include <stdio.h> #incl ...

随机推荐

  1. github上fork了别人的项目后,再同步更新别人的提交

    我从github网站和用Git命令两种方式说一下. github网站上操作 打开自己的仓库,进入code下面. 点击new pull request创建.  选择base fork 选择head fo ...

  2. Python网络编程(2)-粘包现象及socketserver模块实现TCP并发

    1. 基于Tcp的远程调用命令实现 很多人应该都使用过Xshell工具,这是一个远程连接工具,通过上面的知识,就可以模拟出Xshell远程连接服务器并调用命令的功能. Tcp服务端代码如下: impo ...

  3. 转:【web前端开发】浏览器兼容性处理大全

    解决思路: ①.写代码的时候遵循W3C标准,按照最新稳定版本的IE或WebKit内核浏览器进行编码 ②.遇到部分无法全面解决浏览器兼容的时候,采取CSS的hack手段进行针对性微调.简单的说,CSS ...

  4. JavaScript 一个进行枚举选择的jquery插件(仿easyui风格)

    某次做项目要实现一个功能: 按星期选择一个连续的时间范围 比如:周一到周五,周六到周日 或 周六到周三 聪明的朋友马上想出办法:用两个选项为周一到周日的下拉列表实现,对 那样可以,但是我觉得不够友好, ...

  5. 吾八哥学Selenium(二):操作输入框/按钮的方法

    一个web页面一定少不了输入框或者按钮这两种元素,那么在Python里如何使用Selenium操作web页面里的输入框和按钮呢?本文带你简单入门. 本文采用了一个例子,就是利用Selenium打开百度 ...

  6. 开启了1000个线程并发去查询elasticsearch把es搞挂了

    org.elasticsearch.transport.RemoteTransportException: [spd-2][172.**.**.**:9300][indices:data/read/s ...

  7. BZOJ 2429: [HAOI2006]聪明的猴子

    Description 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地 表还是被大水淹没着,部分植物的树冠露在水面上.猴子不会游泳,但跳跃能力比较 ...

  8. hi3531串口波特率计算

    波特率配置 通过配置寄存器UART_IBRD 和UART_FBRD 可以设置UART 工作的波特率,波特率 计算公式为: 当前波特率=UART 参考时钟频率(1/2 总线时钟频率)/(16 x 分频系 ...

  9. PLSQL Developer报错(一)

    PLSQL Developer报错(一) 今天,我遇到了一个奇怪的问题,PLSQL Developer连接不上数据库,而且配置和数据库用户名密码都正确. 查找了半天的资料,也没有发现什么解决的办法.实 ...

  10. VxWorks6.6 pcPentium BSP 使用说明(一):基本概念

    "VxWorks6.6 BSP 使用说明"将发布pcPentium和idp945两个系列的BSP的使用说明.每个系列约5篇文章.之后还将发布由这两个官方提供的BSP的实战移植方法. ...