CodeForces 24D Broken Robot
题意:n*m的棋盘,一个机器人在(i,j)处,每次等概率地停在原地,向左移动一格,向右移动一格,向下移动一格(不能移出棋盘).求走到最后一行所需期望步数.n<=1000,m<=1000
一个看起来可以用来DP的顺序是永远只能从上面走到下面,但同一行之间的转移会出现环.如果n和m的范围稍微小一点,我们可以像SDOI走迷宫一题跑一个分层的高斯消元,但这个题的范围比较大,会超时,但这道题的背景暗示我们列出来的方程组会比较规则,我们不妨先把方程列出来看看有什么特点.
设F[i][j]为从第i行第j列走到最后一行的期望步数
则有
F[i][1]=1+F[i][1]/3+F[i][2]/3+F[i+1]/3
F[i][j]=1+F[i][j]/4+F[i][j-1]/4+F[i][j+1]/4+F[i+1][j]/4,2<=j<=m-1
F[i][m]=1+F[i][m-1]/3+F[i+1][m]/3+F[i][m]/3
不妨仍考虑从第i+1行推到第i行.那么我们在求解F[i][1…m]的时候应当已经知道F[i+1][1…m],边界显然是F[n][j]=0
对于一行,有两个方程只有两个未知数,m-2个方程有三个未知数
如果两个方程里面是同两个未知数,我们可以直接解出这两个未知数,但现在F[i][1]和F[i][m]的未知数并不一定是同两个,我们可以考虑对这些式子进行变形.
F[i][1]的方程和F[i][1],F[i][2]有关,F[i][2]的方程和F[i][1],F[i][2],F[i][3]有关,那么我们可以用这两个方程消掉F[i][1],得到关于F[i][2]和F[i][3]的二元一次方程,接下来再和F[i][3]的方程相消,可以得到关于F[i][3]和F[i][4]的方程….最终我们就可以解出最右端的F[i][m],此后顺着推回来,复杂度O(n).
实现的时候我把每个二元一次方程表示成F[i][j]=a[j]*F[i][j+1]+b[j]的形式,比较容易理解.
转移的式子可能需要简单推一下,见代码.
注意m=1的情况要特判.
#include<cstdio>
double f[][];
double a[],b[];
int main(){
int n,m,x0,y0;scanf("%d%d%d%d",&n,&m,&x0,&y0);
if(m==){
a[n]=;
for(int i=n-;i>=x0;--i){
a[i]=a[i+]+;
}
printf("%.4f\n",a[x0]);
}else{
for(int i=;i<=m;++i)f[n][i]=;
for(int i=n-;i>=x0;--i){
a[]=0.5;b[]=f[i+][]/+1.5;
for(int j=;j<m;++j){
b[j]=b[j-]/4.0+f[i+][j]/4.0+1.0;
a[j]=0.25;
a[j]/=(0.75-a[j-]/4.0);b[j]/=(0.75-a[j-]/4.0);
}
f[i][m]=(b[m-]+f[i+][m]+3.0)/(-a[m-]);
for(int j=m-;j>=;--j)f[i][j]=b[j]+a[j]*f[i][j+];
}
printf("%.4f\n",f[x0][y0]);
}
return ;
}
CodeForces 24D Broken Robot的更多相关文章
- CodeForces 24D Broken robot(期望+高斯消元)
CodeForces 24D Broken robot 大致题意:你有一个n行m列的矩形板,有一个机器人在开始在第i行第j列,它每一步会随机从可以选择的方案里任选一个(向下走一格,向左走一格,向右走一 ...
- CodeForces 24D Broken robot (概率DP)
D. Broken robot time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- Codeforces.24D.Broken robot(期望DP 高斯消元)
题目链接 可能这儿的会更易懂一些(表示不想再多写了). 令\(f[i][j]\)表示从\((i,j)\)到达最后一行的期望步数.那么有\(f[n][j]=0\). 若\(m=1\),答案是\(2(n- ...
- codeforces 24d Broken robot 期望+高斯消元
题目传送门 题意:在n*m的网格上,有一个机器人从(x,y)出发,每次等概率的向右.向左.向下走一步或者留在原地,在最左边时不能向右走,最右边时不能像左走.问走到最后一行的期望. 思路:显然倒着算期望 ...
- CF 24 D. Broken robot
D. Broken robot 链接. 题意: 一个方格,从(x,y)出发,等价的概率向下,向左,向右,不动.如果在左右边缘上,那么等价的概率不动,向右/左,向下.走到最后一行即结束.求期望结束的步数 ...
- [Codeforces-div.1 24D] Broken robots
[Codeforces-div.1 24D] Broken robots 试题分析 显然设\(f_{i,j}\)为到\((i,j)\)的期望步数,将转移表达式列出来. 首先自己跟自己的项消掉. 然后规 ...
- 『Broken Robot 后效性dp 高斯消元』
Broken Robot Description 你作为礼物收到一个非常聪明的机器人走在矩形板上.不幸的是,你明白它已经破碎并且行为相当奇怪(随机).该板由N行和M列单元组成.机器人最初位于第i行和第 ...
- CodeForces 1251A --- Broken Keyboard
[CodeForces 1251A --- Broken Keyboard ] Description Recently Polycarp noticed that some of the butto ...
- Broken robot CodeForces - 24D (概率DP)
You received as a gift a very clever robot walking on a rectangular board. Unfortunately, you unders ...
随机推荐
- poi读取excel模板,填充内容并导出,支持导出2007支持公式自动计算
/** * 版权所有(C) 2016 * @author www.xiongge.club * @date 2016-12-7 上午10:03:29 */ package xlsx; /** * @C ...
- ASP.Net MVC数据传递
今天做了个项目,涉及到离线下载HTML,没有前后台交互,没有Ajax,JavaScript,只有第一次从控制器带参数进入,一次读取到页面所需要的全部数据,使用Razor语法绑定到前台页面,在做这个项目 ...
- vue.js初级入门之最基础的双向绑定操作
首先在页面引入vue.js以及其他需要用到的或者可能要用到的插件(这里我多引用了bootstrap和jquery) 引用的时候需要注意文件的路径,准备工作这样基本就完成了,下面正式开始入门. vue. ...
- 玩儿转物联网IoT - 在Beagle Bone Black上运行node.js 程序
物联网(IoT)技术方兴未艾,智能手环,智能血压计,智能眼镜甚至智能鞋垫都开始进入我们的生活,各种智能设备层出不穷,世界已经到了一个"人有多大胆,地有多大产"的时代,不玩儿点物联网 ...
- 简单的学习心得:网易云课堂Android开发第五章SharedPreferences与文件管理
一.SharedPreferences (1)SharedPreferences能够用来保存一些属于基本数据类型的数据. (2)保存数据,删除数据都是由SharedPreferences的内部接口Ed ...
- 网页万能排版布局插件,web视图定位布局创意技术演示页
html万能排版布局插件,是不是感觉很强大,原理其实很简单,不过功能很强大哈哈,大量节省排版布局时间啊! test.html <!doctype html> <html> &l ...
- PostgreSql性能测试
# PostgreSql性能测试 ## 1. 环境+ 版本:9.4.9+ 系统:OS X 10.11.5+ CPU:Core i5 2.7G+ 内存:16G+ 硬盘:256G SSD ## 2. 测试 ...
- ITIS-资料集合贴
ITIS-资料集合贴 说明:这个贴用于收集笔者能力范围内收集收藏并认为有用的资料,方便各方参考,免去到处找寻之苦,提升信息的交叉引用价值.另外,笔者就自己感悟做了部分评注,且可能尝试不断的优化分类和排 ...
- 怎么修改与设置.jsp文件属性?
1.首先 打开 >> Myeclipse或Eclipse.(我用的是Myeclipse) 2.打开 >> Window >> Preferences ...
- 【FLUENT案例】02:DPM模型
1 引子1.1 案例描述1.2 学习目标1.3 模拟内容2 启动FLUENT并导入网格3 材料设置4 Cell Zones Conditions5 Calculate6 定义Injecions7 定义 ...