HDU3853 LOOPS 期望DP基础题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3853
题目大意(只是大意,名字什么的可能和原题描述不一样~):
爱丽丝与华容道
题目描述
爱丽丝是一个魔法师。
爱丽丝想要帮助她的朋友爱迪生拯救这个世界。但是她现在被困在了一个叫做“华容道”的迷宫中。
华容道是一个由R*C个格子组成的矩形,他有R行,每一行有C列格子。除了出口格子外,每个格子都有一个传送门。爱丽丝每开一次传送门需要消耗2颗魔力豆。我们假设现在爱丽丝在格子(r,c)上,那么当爱丽丝使用了2颗魔力豆打开传送门并且进入传送门之后,这个传送门可能会将她传送到下方的格子(r+1,c)上,也有可能将他传送到右侧的格子(r,c+1)上,当然咯,这个传送门也有一定的概率传送失败,如果传送失败,那么爱丽丝还是会返回当前的格子(r,c)上。
在一开始,爱丽丝在华容道的左上角(1,1)处,而华容道的出口在右下角(R,C)处。你的任务是帮助爱丽丝计算他到达出口时消耗魔力豆的期望数量,以帮助她提前了解她是否具有足够的魔力豆来拯救世界。
输入
输入的第一行包含两个正数R和C(2<=R,C<=1000)。
接下来有R行数据,每行有C*3个实数(这些实数都会精确到小数点后两位),每三个数为一组。第r行的第c组的三个数分别表示从(r,c)到(r,c),(r,c+1),(r+1,c)的概率。同一行的每组数据之间有4个空格分隔。
输入数据保证每组的三个数相加等于1,最右边的组的第二个数为0(因为最右边的格子没有办法再往右了),最后一行的各组的第三个数为0(因为最下面的格子没有办法再往下了)。
你可以忽略右下角那组输入数据。他们的出现仅仅是为了输入数据的格式看上去比较整齐而已。
对于所有的数据,答案都保证不会超过1000000。
输出
输出一个实数,保留三位小数位,表示魔法师爱丽丝逃离华容道德期望消耗魔力豆数量。
样例输入
2 2
0.00 0.50 0.50 0.50 0.00 0.50
0.50 0.50 0.00 1.00 0.00 0.00
样例输出
6.000
题目分析
我们假设 dp[i][j] 表示从(i,j)到达(R,C)的期望魔力豆数,则 dp[R][C]=0 ,我们需要求解的就是 dp[1][1] 。
我们设 p0[i][j] 表示(i,j)留在原地的概率, p1[i][j] 表示(i,j)到达(i,j+1)的概率, p2[i][j] 表示(i,j)到达(i+1,j)的概率,那么我们可以这么想:
爱丽丝消耗了2颗魔力豆:
- 她可能有
p[i][j]的概率留在原地,所以(i,j)-->(i,j)的情况下的期望组成部分为:
p0[i][j] * (dp[i][j] + 2)
- 她可能有
p1[i][j]的概率到达右边的格子,所以(i,j)-->(i,j+1)的情况下的期望组成部分为:
p1[i][j] * (dp[i][j+1] + 2)
- 她可能有
p2[i][j]的概率到达下方的格子,所以(i,j)-->(i+1,j)的情况下的期望组成部分为:
p2[i][j] * (dp[i+1][j] + 2)
如上3部分相加就得到了实际的期望的公式:
dp[i][j] = p0[i][j] * (dp[i][j] + 2) + p1[i][j] * (dp[i][j+1] + 2) + p2[i][j] * (dp[i+1][j] + 2)
= p0[i][j] * dp[i][j] + p1[i][j] * dp[i][j+1] + p2[i][j] * dp[i+1][j] + 2
进一步推导得到:
dp[i][j] = (p1[i][j] * dp[i][j+1] + p2[i][j] * dp[i+1][j] + 2) / (1 - p0[i][j])
可能存在一种情况是 p0[i][j] == 1 ,这种情况等于说当你到达这个点以后你就出不来了,虽然题目意思中保证了我们能够顺利到达(R,C)节点,但是它并没有保证我们在进入另外的那些点我们进去了就出不来了的情况出现。
示例代码:
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
#define EPS 1e-6
const int maxn = 1010;
int R, C;
double p0[maxn][maxn], p1[maxn][maxn], p2[maxn][maxn], dp[maxn][maxn];
int main() {
while (~scanf("%d%d", &R, &C)) {
for (int i = 1; i <= R; i ++) {
for (int j = 1; j <= C; j ++) {
scanf("%lf%lf%lf", &p0[i][j], &p1[i][j], &p2[i][j]);
}
}
dp[R][C] = 0;
for (int i = R; i >= 1; i --) {
for (int j = C; j >= 1; j --) {
if (i == R && j == C) continue;
if (fabs(1 - p0[i][j]) < EPS) continue;
dp[i][j] = (p1[i][j] * dp[i][j+1] + p2[i][j] * dp[i+1][j] + 2) / (1 - p0[i][j]);
}
}
printf("%.3lf\n", dp[1][1]);
}
return 0;
}
注意:这道题目有点卡数据,用cin会超时。
参考链接:https://www.cnblogs.com/kuangbin/archive/2012/10/03/2711140.html
HDU3853 LOOPS 期望DP基础题的更多相关文章
- HDU3853 LOOPS 期望DP 简单
http://acm.hdu.edu.cn/showproblem.php?pid=3853 有一点坑的地方是如果一个地方停在原地的概率为1,那么该地的期望为0,就相当于这个地方也是一个出口... ...
- hdu 2089 不要62 (数位dp基础题)
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- poj 2955 Brackets (区间dp基础题)
We give the following inductive definition of a “regular brackets” sequence: the empty sequence is a ...
- 【HDU3853】LOOPS [期望DP]
LOOPS Time Limit: 5 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description Akemi Homura is a ...
- 期望dp好题选做
前言: 最近连考两场期望dp的题目,sir说十分板子的题目我竟然一点也不会,而且讲过以后也觉得很不可改.于是开个坑. 1.晚测10 T2 大佬(kat) 明明有\(O(mlog)\)的写法,但是\(m ...
- hdu3853 LOOPS(概率dp) 2016-05-26 17:37 89人阅读 评论(0) 收藏
LOOPS Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others) Total Su ...
- poj2642 The Brick Stops Here(DP基础题)
比基础的多一点东西的背包问题. 链接:POJ2642 大意:有N种砖,每种花费p[i],含铜量c[i],现需要用M种不同的砖融成含铜量在Cmin到Cmax之间(可等于)的砖,即这M种砖的含铜量平均值在 ...
- hdu 2845(dp基础题)
题意:容易理解. 分析:以后碰到这种类型的题,就要考虑把矩阵先按行来处理,再按列处理.先算出每行能够能够得到的最大值,然后按列处理即可. 代码实现: #include<stdio.h> # ...
- 51Nod 1083 矩阵取数问题(矩阵取数dp,基础题)
1083 矩阵取数问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下 ...
随机推荐
- [React] Write a Custom State Hook in React
Writing your own custom State Hook is not as a daunting as you think. To keep things simple, we'll r ...
- php+ ueditor word粘贴上传
最近公司做项目需要实现一个功能,在网页富文本编辑器中实现粘贴Word图文的功能. 我们在网站中使用的Web编辑器比较多,都是根据用户需求来选择的.目前还没有固定哪一个编辑器 有时候用的是UEditor ...
- FTP与HTTP上传文件的对比
许多站点,比如facebook或一些博客等都允许用户上传或下载文件,比如论坛或博客系统的图片. 在这种情况下,通常有两种选择上传文件到服务器,那就是FTP协议和HTTP协议. 以下列出了一些两者的不同 ...
- 数据库(以MySQL为例)
一.数据库简介 数据库就是数据的仓库,用来按照特定的结构去组织和管理数据,有了数据库可以更加方便.便捷的操作需要保存的数据 不管是什么数据库,最终都是将数据保存到硬盘中,只是存储的格式不同于文本文件 ...
- 下载svn
http://subversion.apache.org/download.cgi?update=201708081800 Windows下载zip,其他系统的下载tar.gz
- 【洛谷】P4167 [Violet]樱花
题面 又懒得弄题面,开个传送门吧 分析 人生第一次切数学题,我们先把方程写出来 $$\frac {1}{x}+\frac {1}{y}=\frac {1}{n!}$$ 现在我们知道的条件是x,y都是正 ...
- UDF-C_UDMI【转载】
UDF定义变量的输出 使用宏: C_UDMI( c, thread, index) 自变量类型:cell_t c Thread *thread int index ...
- 深入理解JVM虚拟机13:再谈四种引用及GC实践
Java中的四种引用类型 一.背景 Java的内存回收不需要程序员负责,JVM会在必要时启动Java GC完成垃圾回收.Java以便我们控制对象的生存周期,提供给了我们四种引用方式,引用强度从强到弱分 ...
- 安卓开发实战之app之版本更新升级(DownloadManager和http下载)完整实现
转载: https://blog.csdn.net/u013278099/article/details/52692008 前言 本文将讲解app的升级与更新.一般而言用户使用App的时候升级提醒有两 ...
- csapp网络编程初学笔记
csapp网络编程初学笔记 客户端-服务器编程模型 每个网络应用都是基于客户端-服务器模型,服务器管理某种资源,并且通过操作来为它的客户提供某种服务 客户端-服务器模型中的基本操作是transacti ...