题意:

有一个N行M列的矩阵,机器人最初位于第i行和第j列。然后,机器人可以在每一步都转到另一个单元。目的是转到最底部(第N个)行。机器人可以停留在当前单元格处,向左移动,向右移动或移动到当前位置下方的单元格。如果机器人在最左侧的列中,则不能向左移动;如果机器人在最右侧的列中,则不能向右移动。在每一步中,所有可能的移动都是同等可能的。返回到达最底行的预期步数。

代码+题解:

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
#define mem(a) memset(a,0,sizeof(a))
#define mem__(a) memset(a,-1,sizeof(a))
typedef long long ll;
const int maxn=1e3+10;
const int N=200;
const int INF=0x3f3f3f3f;
const double blo=1.0/3.0;
const double eps=1e-8;
double dp[maxn][maxn],a[maxn][maxn],b[maxn];
int main()
{
int x,y,n,m;
scanf("%d%d",&n,&m);
scanf("%d%d",&x,&y);
mem(dp);
if(m==1)
{
printf("%.4lf\n",2.0*(n-x));
return 0;
}
/*
dp[i][1]-1/2dp[i][2]=3/2+1/2dp[i+1][1]
-1/4dp[i][j-1]+3/4dp[i][j]-1/4dp[i][j+1]=1+1/4dp[i+1][j],1<j<m
-1/2dp[i][m-1]+dp[i][m]=3/2+1/2dp[i+1][m]
*/
for(int i=n-1; i>=1; --i)
{
/*
构造一个矩阵
x1 x2 x3...xn 代表的是未知变量dp[i][j]前面的系数,这个系数放在a数组里面
由上面三个公式就是分别求dp[i][1]和dp[i][j]和dp[i][m]的公式
dp[i][1]需要用到前两个变量dp[i][2]和dp[i+1][1]
dp[i][j]就需要用到变量dp[i][j-1],dp[i][j+1],dp[i+1][j]
dp[i][m]需要用到前两个变量dp[i][m-1]和dp[i+1][m]
那么它们的系数就会构造一个下面这样的矩阵
x x 0 0 0 这一行中我们设第一个x为x1,另一个为x2.那么x1=1.0,x2=-1/2 ,b[1]= 3/2+1/2dp[i+1][1],b数组下面有解释
x x x 0 0
0 x x x 0
0 0 x x x
0 0 0 x x
这个矩阵肯定是一个正方形,因为n个未知数需要n个方程,所以肯定矩阵是一个正方形矩阵
另外我们还需要一个b数组来保存这n个方程右边的值,这个右边的值是不含未知数,所以是一个已知值

     之后就是高斯消元部分:
我们可以通过方程之间的加减乘除来使这个系数矩阵变成
x x 0 0 0
0 x x 0 0
0 0 x x 0
0 0 0 x x
0 0 0 0 x 然后我们再化简成
x 0 0 0 0
0 x 0 0 0
0 0 x 0 0
0 0 0 x 0
0 0 0 0 x 这个样子的话就变成了一元一次方程,那么一层for循环就可以求出来所有未知量的值
*/
for(int j=2; j<m; ++j)
{
a[j][j]=-1*3.0/4.0;
a[j][j-1]=1.0/4.0;
a[j][j+1]=1.0/4.0;
b[j]=-1.0-1.0/4.0*dp[i+1][j];
}
if(m>=2)
{
a[m][m] = a[1][1] = -2.0 / 3;
a[1][2] = a[m][m - 1] = 1.0 / 3;
b[1] = -1 - dp[i + 1][1] / 3.0;
b[m] = -1 - dp[i + 1][m] / 3.0;
}
for(int j = 1; j < m; j++)
{
if(fabs(a[j+1][j])< eps) continue;
double rate = a[j + 1][j] / a[j][j];
for(int k = 0; k < 2; k++)
a[j + 1][j + k]-=a[j][j + k]*rate;
b[j + 1]-=b[j]*rate;
}
for(int j = m; j > 1; j--)
{
if(fabs(a[j - 1][j]) < eps) continue;
double rate = a[j - 1][j] / a[j][j];
a[j - 1][j] -= a[j][j] * rate;
b[j - 1] -= b[j] * rate;
}
for(int j=1;j<=m;++j)
dp[i][j]=b[j]/a[j][j];
}
printf("%.4lf\n",dp[x][y]);
return 0;
}

Broken robot CodeForces - 24D (三对角矩阵简化高斯消元+概率dp)的更多相关文章

  1. BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡 [高斯消元 概率DP]

    1778: [Usaco2010 Hol]Dotp 驱逐猪猡 题意:一个炸弹从1出发p/q的概率爆炸,否则等概率走向相邻的点.求在每个点爆炸的概率 高斯消元求不爆炸到达每个点的概率,然后在一个点爆炸就 ...

  2. BZOJ 2337: [HNOI2011]XOR和路径 [高斯消元 概率DP]

    2337: [HNOI2011]XOR和路径 题意:一个边权无向连通图,每次等概率走向相连的点,求1到n的边权期望异或和 这道题和之前做过的高斯消元解方程组DP的题目不一样的是要求期望异或和,期望之间 ...

  3. LightOJ 1151 - Snakes and Ladders 高斯消元+概率DP

    首先来个期望的论文,讲的非常好,里面也提到了使用线性方程组求解,尤其适用于有向图的期望问题. 算法合集之<浅析竞赛中一类数学期望问题的解决方法> http://www.lightoj.co ...

  4. [luogu2973]driving out the piggies 驱逐猪猡【高斯消元+概率DP】

    看到题面的那一刻,我是绝望的ORZ 图论加概率期望加好像不沾边的高斯消元???我人直接傻掉 还没学过概率期望的我果断向题解屈服了(然后还是傻掉了两节课来找线性方程.. Description 奶牛们建 ...

  5. light oj 1151 - Snakes and Ladders 高斯消元+概率DP

    思路: 在没有梯子与蛇的时候很容易想到如下公式: dp[i]=1+(∑dp[i+j])/6 但是现在有梯子和蛇也是一样的,初始化p[i]=i; 当有梯子或蛇时转移为p[a]=b; 这样方程变为: dp ...

  6. UVa 10828 Back to Kernighan-Ritchie 高斯消元+概率DP

    题目来源:UVa 10828 Back to Kernighan-Ritchie 题意:从1開始 每次等概率从一个点到和他相邻的点 有向 走到不能走停止 求停止时每一个点的期望 思路:写出方程消元 方 ...

  7. bzoj 2337 高斯消元+概率DP

    题目大意: 每条路径上有一个距离值,从1走到N可以得到一个所有经过路径的异或和,求这个异或和的数学期望 这道题直接去求数学期望的DP会导致很难列出多元方程组 我们可以考虑每一个二进制位从1走到N的平均 ...

  8. BZOJ_3503_[Cqoi2014]和谐矩阵_高斯消元

    BZOJ_3503_[Cqoi2014]和谐矩阵_高斯消元 题意: 我们称一个由0和1组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1.一个元素相邻的元素包括它本身,及他上下左右的4个元素(如果 ...

  9. Broken robot CodeForces - 24D (概率DP)

    You received as a gift a very clever robot walking on a rectangular board. Unfortunately, you unders ...

随机推荐

  1. LeetCode167 两数之和 II - 输入有序数组

    给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值 ...

  2. 【Docker】1、 前后端分离项目 下载启动运行

    人人开源前后端分离项目下载与配置 文章目录 人人开源前后端分离项目下载与配置 前后端分离框架介绍 后端项目下载与配置 1.renren-fast后台项目介绍 2.开发环境搭建 3.下载后端renren ...

  3. iostat的输出

    第一行显示的时子系统启动以来的平均值,接下来的报告显示了增量的平均值,每个设备一行 Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   ...

  4. 【Linux】reverse mapping checking getaddrinfo for XXX.XXXX.com failed - POSSIBLE BREAKIN ATTEMPT!

    ------------------------------------------------------------------------------------------------- | ...

  5. SDUST数据结构 - chap2 线性表

    一.判断题: 二.选择题: 三.编程题: 7-1 jmu-ds-顺序表区间元素删除 : 输入样例: 10 5 1 9 10 67 12 8 33 6 2 3 10 输出样例: 1 67 12 33 2 ...

  6. linux下删除文件夹及下面所有文件

    使用rm -rf 目录名字 命令即可 -r 就是向下递归,不管有多少级目录,一并删除-f 就是直接强行删除,不作任何提示的意思 rm 不带参数 只能删除文件 rm test.txt mkdir /us ...

  7. 入门OJ:简单的网络游戏

    题目描述 在某款极具技术含量的网络游戏中,佳佳靠着他的聪明智慧垄断了游戏中的油田系统.油田里有许多油井,这些油井排成一个M*N的矩形.每个油井都有一个固定的采油量.每两个相邻的油井之间有一条公路,这些 ...

  8. Python 中 lru_cache 的使用和实现

    在计算机软件领域,缓存(Cache)指的是将部分数据存储在内存中,以便下次能够更快地访问这些数据,这也是一个典型的用空间换时间的例子.一般用于缓存的内存空间是固定的,当有更多的数据需要缓存的时候,需要 ...

  9. vue中computed/method/watch的区别

    摘要:本文通过官方文档结合源码来分析computed/method/watch的区别. Tips:本文分析的源码版本是v2.6.11,文章中牵涉到vue响应式系统原理部分,如果不是很了解,建议先阅读上 ...

  10. winform 扫码识别二维码

    因为公司业务需求,需要在Windows系统下调用摄像头识别二维码需求,就有了这个功能. 我根据网上网友提供的一些资料,自己整合应用到项目中,效果还不错(就是感觉像素不是太好) 现在将调用摄像头+识别二 ...