CodeForces 24D Broken robot(期望+高斯消元)
CodeForces 24D Broken robot
大致题意:你有一个n行m列的矩形板,有一个机器人在开始在第i行第j列,它每一步会随机从可以选择的方案里任选一个(向下走一格,向左走一格,向右走一格,留在原地),现在我们要求它走到最后一行的期望步数
$ solution: $
这道题我们可以从最后一行开始递推(这是一个期望DP的惯用套路,因为只有最后的期望我们可以得出是1或者0,前面的都是未知的),但是我们很快发现会有一些难以解决的方程。因为每一行的每一个格子都可以组成一个方程,但是这些格子都是未知的,只有他们的下一行的所有格子已知(我们从下向上倒推)。也就是说这一行格子会组成m个两两相关联的线性方程组。我们知道解方程组可以用高斯消元,但是高斯消元的复杂度为三方的。博主困在这里了好久,最后看书才发现原来自己这么笨。众所周知的,高斯消元的优化有很多种,我们要好好的利用其性质。而这一题的方程组每一个格子的期望都只和他左边和右边的格子的期望有关联,所以我们的系数矩阵很多都是0,这些我们都不用计算。我们只需要消掉左边一个和右边一个就可以了。这样高斯消元的实际复杂度就变成了 $ O(m) $ (具体看代码)然后我们就可以过这道题了。
$ code: $
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#define ll long long
#define db double
#define rg register int
using namespace std;
int n,m,sx,sy;
db f[1005][1005];
db s[1005][1005];
inline int qr(){
char ch;
while((ch=getchar())<'0'||ch>'9');
int res=ch^48;
while((ch=getchar())>='0'&&ch<='9')
res=res*10+(ch^48);
return res;
}
int main(){
n=qr(); m=qr();
sx=qr(),sy=qr();
if(m==1){
printf("%.10lf\n",(db)2*(n-sx));
return 0;
}
for(rg i=n-1;i>=sx;--i){
s[1][1]=s[m][m]=(db)2/3;
s[m][m+1]=f[i+1][m]/3+1;
s[1][2]=s[m][m-1]=-(db)1/3;
s[1][m+1]=f[i+1][1]/3+1;
for(rg j=2;j<m;++j){
s[j][j]=(db)3/4;
s[j][m+1]=f[i+1][j]/4+1;
s[j][j-1]=s[j][j+1]=-(db)1/4;
}
for(rg j=1;j<m;++j){
db x=s[j+1][j]/s[j][j];
s[j+1][j+1]-=s[j][j+1]*x;
s[j+1][m+1]-=s[j][m+1]*x;
}
for(rg j=m;j>1;--j){
db x=s[j-1][j]/s[j][j];
s[j-1][m+1]-=s[j][m+1]*x;
}
for(rg j=1;j<=m;++j)
f[i][j]=s[j][m+1]/s[j][j];
}
printf("%.10lf\n",f[sx][sy]);
return 0;
}
CodeForces 24D Broken robot(期望+高斯消元)的更多相关文章
- codeforces 24d Broken robot 期望+高斯消元
题目传送门 题意:在n*m的网格上,有一个机器人从(x,y)出发,每次等概率的向右.向左.向下走一步或者留在原地,在最左边时不能向右走,最右边时不能像左走.问走到最后一行的期望. 思路:显然倒着算期望 ...
- Codeforces.24D.Broken robot(期望DP 高斯消元)
题目链接 可能这儿的会更易懂一些(表示不想再多写了). 令\(f[i][j]\)表示从\((i,j)\)到达最后一行的期望步数.那么有\(f[n][j]=0\). 若\(m=1\),答案是\(2(n- ...
- $CF24D\ Broken Robot\ DP+$高斯消元
Luogu Description 你收到的礼物是一个非常聪明的机器人,行走在一块长方形的木板上.不幸的是,你知道它是坏的,表现得相当奇怪(随机).该板由n行和m列的单元格组成.机器人最初是在i行和j ...
- 【BZOJ】3143: [Hnoi2013]游走 期望+高斯消元
[题意]给定n个点m条边的无向连通图,每条路径的代价是其编号大小,每个点等概率往周围走,要求给所有边编号,使得从1到n的期望总分最小(求该总分).n<=500. [算法]期望+高斯消元 [题解] ...
- 【BZOJ】2337: [HNOI2011]XOR和路径 期望+高斯消元
[题意]给定n个点m条边的带边权无向连通图(有重边和自环),在每个点随机向周围走一步,求1到n的期望路径异或值.n<=100,wi<=10^9. [算法]期望+高斯消元 [题解]首先异或不 ...
- [BZOJ3143][HNOI2013]游走(期望+高斯消元)
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3576 Solved: 1608[Submit][Status ...
- CodeForces 24D Broken Robot
题意:n*m的棋盘,一个机器人在(i,j)处,每次等概率地停在原地,向左移动一格,向右移动一格,向下移动一格(不能移出棋盘).求走到最后一行所需期望步数.n<=1000,m<=1000 一 ...
- 【BZOJ 3143】【Hnoi2013】游走 期望+高斯消元
如果纯模拟,就会死循环,而随着循环每个点的期望会逼近一个值,高斯消元就通过列方正组求出这个值. #include<cstdio> #include<cctype> #inclu ...
- Codeforces Gym10008E Harmonious Matrices(高斯消元)
[题目链接] http://codeforces.com/gym/100008/ [题目大意] 给出 一个n*m的矩阵,要求用0和1填满,使得每个位置和周围四格相加为偶数,要求1的数目尽量多. [题解 ...
随机推荐
- Python之Regular Expressions(正则表达式)
在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要.正则表达式就是用于描述这些规则的工具.换句话说,正则表达式就是记录文本规则的代码. 很可能你使用过Windows/Dos下用 ...
- Mychael原创题 洛谷T23923 Mychaelの水题 【题解】
原题链接 题目大意: 有来自三个地区的人各a,b,c位,他们排成了一排.请问有多少种不同类型的排法,使得相邻的人都来自不同的地区 \(a,b,c<=200\) 答案取模 题解 弱弱的标程解法 设 ...
- 【组合数+Lucas定理模板】HDU 3037 Saving
acm.hdu.edu.cn/showproblem.php?pid=3037 [题意] m个松果,n棵树 求把最多m个松果分配到最多n棵树的方案数 方案数有可能很大,模素数p 1 <= n, ...
- 将list分成等数量
import java.util.ArrayList; import java.util.List; public class CollectionGroupUtil { public static ...
- jenkins执行自动化用例(详细、有用、mark 优先级高高高)
http://blog.sina.com.cn/s/blog_68f262210102vx8o.html 第七章 测试用例接入jenkins自动运行 ------Web自动化测试之Webdriver+ ...
- VMware---之网卡设置
闲来无事,扯点皮,详细说下NAT配置过程 NAT全称Network Address Translation网络地址转换,顾名思义,配置的重点也是地址转换. 步骤1.配置局域网段及网关 打开vmware ...
- 【HDOJ6228】Tree(树)
题意:有一棵n个点的树,在树上的点涂色,每个点涂一种颜色,一共可以涂k种颜色, 然后把同一种颜色(比如说x)的点用最优方案连起来,在连线的边涂上x颜色,问涂k次的边最多有几条 k<=500 si ...
- 标准C程序设计七---12
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- Kail命令
启动/关闭无线网卡 ifconfig wlan0 up / ifconfig wlan0 down 更改Mac地址: macchanger -A wlan0 启动监听 airmon-ng star ...
- MyBatis的参数,不能传入null
今天在调试的过程中发现一个bug,把传入的参数写到查询分析器中执行没有问题,但是在程序中执行就报错:org.springframework.jdbc.UncategorizedSQLException ...