Broken robot CodeForces - 24D (三对角矩阵简化高斯消元+概率dp)
题意:
有一个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)的更多相关文章
- BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡 [高斯消元 概率DP]
1778: [Usaco2010 Hol]Dotp 驱逐猪猡 题意:一个炸弹从1出发p/q的概率爆炸,否则等概率走向相邻的点.求在每个点爆炸的概率 高斯消元求不爆炸到达每个点的概率,然后在一个点爆炸就 ...
- BZOJ 2337: [HNOI2011]XOR和路径 [高斯消元 概率DP]
2337: [HNOI2011]XOR和路径 题意:一个边权无向连通图,每次等概率走向相连的点,求1到n的边权期望异或和 这道题和之前做过的高斯消元解方程组DP的题目不一样的是要求期望异或和,期望之间 ...
- LightOJ 1151 - Snakes and Ladders 高斯消元+概率DP
首先来个期望的论文,讲的非常好,里面也提到了使用线性方程组求解,尤其适用于有向图的期望问题. 算法合集之<浅析竞赛中一类数学期望问题的解决方法> http://www.lightoj.co ...
- [luogu2973]driving out the piggies 驱逐猪猡【高斯消元+概率DP】
看到题面的那一刻,我是绝望的ORZ 图论加概率期望加好像不沾边的高斯消元???我人直接傻掉 还没学过概率期望的我果断向题解屈服了(然后还是傻掉了两节课来找线性方程.. Description 奶牛们建 ...
- light oj 1151 - Snakes and Ladders 高斯消元+概率DP
思路: 在没有梯子与蛇的时候很容易想到如下公式: dp[i]=1+(∑dp[i+j])/6 但是现在有梯子和蛇也是一样的,初始化p[i]=i; 当有梯子或蛇时转移为p[a]=b; 这样方程变为: dp ...
- UVa 10828 Back to Kernighan-Ritchie 高斯消元+概率DP
题目来源:UVa 10828 Back to Kernighan-Ritchie 题意:从1開始 每次等概率从一个点到和他相邻的点 有向 走到不能走停止 求停止时每一个点的期望 思路:写出方程消元 方 ...
- bzoj 2337 高斯消元+概率DP
题目大意: 每条路径上有一个距离值,从1走到N可以得到一个所有经过路径的异或和,求这个异或和的数学期望 这道题直接去求数学期望的DP会导致很难列出多元方程组 我们可以考虑每一个二进制位从1走到N的平均 ...
- BZOJ_3503_[Cqoi2014]和谐矩阵_高斯消元
BZOJ_3503_[Cqoi2014]和谐矩阵_高斯消元 题意: 我们称一个由0和1组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1.一个元素相邻的元素包括它本身,及他上下左右的4个元素(如果 ...
- Broken robot CodeForces - 24D (概率DP)
You received as a gift a very clever robot walking on a rectangular board. Unfortunately, you unders ...
随机推荐
- 用 Flutter 搭建标签+导航框架
前言 在 Flutter 这个分类的第一篇文章总结了下最新的 Mac 搭建 Flutter 开发环境和对声明式UI这个理解的东西,前面也有提过,准备像在 SwiftUI 分类中那样花一些功夫来写一个 ...
- LeetCode94 二叉树的中序遍历
给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? /** * ...
- python学习笔记 | wordcloud安装指南
问题: 直接在命令行输入: pip install wordcloud 不出意外,直接报错,显示缺失vc*****.bat,意思是缺失vc版本,这个安装方式基本可以扔掉. 解决: http://t.c ...
- (十七)logging模块
logging模块是Python内置的标准模块,主要用于输出运行日志. 简单应用 import logging logging.debug('+++debug+++') logging.info('+ ...
- Java并发/多线程-CAS原理分析
目录 什么是CAS 并发安全问题 举一个典型的例子i++ 如何解决? 底层原理 CAS需要注意的问题 使用限制 ABA 问题 概念 解决方案 高竞争下的开销问题 什么是CAS CAS 即 compar ...
- Objects as Points:预测目标中心,无需NMS等后处理操作 | CVPR 2019
论文基于关键点预测网络提出CenterNet算法,将检测目标视为关键点,先找到目标的中心点,然后回归其尺寸.对比上一篇同名的CenterNet算法,本文的算法更简洁且性能足够强大,不需要NMS等后处理 ...
- CALL TRANSACTION 使用说明
以调用事务VA03为例: 在程序中添加如下代码就可以实现 SET PARAMETER ID 'AUN' FIELD var. CALL TRANSACTION 'VA03' AND SKIP FIR ...
- ABAP program lines are wider than the internal table
错误详细描述: An exception occurred that is explained in detail below.The exception, which is assigned to ...
- typora+PicGo+gitee搭建免费的的床
一.gitee 1.第一步拥有自己的gitee账号 没有的可以自己去注册gitee地址 2.使用自己的gitee账号创建仓库 创建好之后注意 记住.com/以后的地址 此处就为y***L/photo- ...
- 给dtcms增加模板自动生成功能
作为dtcms的使用者你是不是像我一样,也在不停的修改模板之后要点击生成模板浪费了很多开发模板的时间? 那就跟我一起给dtcms增加一个开发者模式,当模板修改完成之后,直接刷新页面就能看到效果,而不再 ...