题目链接: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基础题的更多相关文章

  1. HDU3853 LOOPS 期望DP 简单

    http://acm.hdu.edu.cn/showproblem.php?pid=3853 有一点坑的地方是如果一个地方停在原地的概率为1,那么该地的期望为0,就相当于这个地方也是一个出口...   ...

  2. hdu 2089 不要62 (数位dp基础题)

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  3. poj 2955 Brackets (区间dp基础题)

    We give the following inductive definition of a “regular brackets” sequence: the empty sequence is a ...

  4. 【HDU3853】LOOPS [期望DP]

    LOOPS Time Limit: 5 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description Akemi Homura is a ...

  5. 期望dp好题选做

    前言: 最近连考两场期望dp的题目,sir说十分板子的题目我竟然一点也不会,而且讲过以后也觉得很不可改.于是开个坑. 1.晚测10 T2 大佬(kat) 明明有\(O(mlog)\)的写法,但是\(m ...

  6. 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 ...

  7. poj2642 The Brick Stops Here(DP基础题)

    比基础的多一点东西的背包问题. 链接:POJ2642 大意:有N种砖,每种花费p[i],含铜量c[i],现需要用M种不同的砖融成含铜量在Cmin到Cmax之间(可等于)的砖,即这M种砖的含铜量平均值在 ...

  8. hdu 2845(dp基础题)

    题意:容易理解. 分析:以后碰到这种类型的题,就要考虑把矩阵先按行来处理,再按列处理.先算出每行能够能够得到的最大值,然后按列处理即可. 代码实现: #include<stdio.h> # ...

  9. 51Nod 1083 矩阵取数问题(矩阵取数dp,基础题)

    1083 矩阵取数问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下 ...

随机推荐

  1. xml---基础了解

    XML 被设计用来传输和存储数据. HTML 被设计用来显示数据. 什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language). XML 是一种很像HTML的标 ...

  2. Comet OJ - Contest #9 & X Round 3题解

    传送门 \(A\) 咕咕 typedef long long ll; int a1,a2,n,d;ll res; int main(){ scanf("%d%d%d",&a ...

  3. Matlab画图的输出格式

    利用Matlab命令,可以输出.eps, .pdf格式的图形.有时候,在图形窗口直接保存会导致图形不完整,这时,可以用如下命令代替: saveas(p1, 't1.eps'); saveas(p1, ...

  4. A. Vasya and Book ( Codeforces Educational Codeforces Round 55 )

    题意:当前在看书的第 x 页,每次可以向前或者向后翻 d 页,这个书一共 n 页,问能否用最小操作翻到第 y 页. 题解:三种情况:1.直接翻能到的一定最短. 2.先翻到第一页,然后往后翻,翻到第 y ...

  5. python中range语法

    规则:一般不取最后一位 start: 计数从 start 开始.默认是从 0 开始.例如range(5)等价于range(0, 5); stop: 计数到 stop 结束,但不包括 stop.例如:r ...

  6. java连数据库和数据库连接池踩坑日记(一)-------oracle连接的一些问题

    最近接触oracle有点多,同时也在配置数据库连接池,坑也就踩多了,记录下. 事情还没有结束,没时间记录问题,很多事情都忘了,过了国庆再写的话可能就真的全忘了吧……而且不单单是数据库问题,还有一些数据 ...

  7. mysql忘记密码恢复

    MySQL忘记密码恢复密码的实现方法 作者:mdxy-dxy 流传较广的方法,mysql中文参考手册上的,各位vps主机租用客户和服务器托管用户忘记mysql5.1管理员密码时,可以使用这种方法破解下 ...

  8. OpenFOAM设置监测点(探针)

    首先准备好我们自己的平常算例文件,本次我们以圆柱绕流的算例来说明用法 然后我们在/opt/openfoam4/etc/caseDicts/postProcessing/probes文件夹下找到prob ...

  9. 已知 sqrt (2)约等于 1.414,要求不用数学库,求 sqrt (2)精确到小数点后 10 位

    问题:已知 sqrt (2)约等于 1.414,要求不用数学库,求 sqrt (2)精确到小数点后 10 位. 出题人:阿里巴巴出题专家:文景/阿里云 CDN 资深技术专家. 考察点:基础算法的灵活应 ...

  10. web开发学习的网站

    网易云课堂>imooc>coursera   网易云课堂 imooc.com 关于web的视频会多一些 最近要学一个付费的课程   http://www.v2ex.com/t/154242 ...