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矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下 ...
随机推荐
- jquery页面多个倒计时效果
<div class="timeBox" data-times="2019/06/30,23:59:59"> 距结束 <span class= ...
- 常见的meta标签属性
meta标签是网页元标签.可以定义一些网站的功能. 1. name属性 name属性的通用格式如下: <meta name="xxx" content="xxxx, ...
- Angular惰性加载的特性模块
一:Angular-CLI建立应用 cmd命令:ng new lazy-app --routing (创建一个名叫 lazy-app 的应用,而 --routing 标识生成了一个名叫 app- ...
- (3)Go运算符
运算符 Go 语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 算数运算符 运算符 描述 + 相加 - 相减 * 相乘 / 相除 % 求余 注意: ++(自增)和--(自 ...
- P5024 保卫王国(动态dp/整体dp/倍增dp)
做法(倍增) 最好写的一种 以下0为不选,1为选 \(f_{i,0/1}\)为\(i\)子树的最小值,\(g_{i,0/1}\)为除i子树外的最小值 \(fh_{i,j,0/1,0/1}\)为确定\( ...
- Linux中的iptables防火墙策略
0x01 简介 iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的"安全框架"中,这个" ...
- Luogu5348 密码解锁
题面 题解 记\(N = \dfrac nm\) 这道题目就是要求\(a_m = \sum_{i=1}^N \mu(i)\mu(im)\) 因为\(\mu(ij) = \mu(i)\mu(j)[\gc ...
- NAT端口映射综合详解
- ICEM-interface相关操作
原视频下载地址: https://pan.baidu.com/s/14Tx-eYPccvhrg5wrg7gYvw 密码: 8fdp
- [教程] Packt - Create a Game Environment with Blender and Unity by Darrin Lile
学习了解如何使用Blender,photoshop和Unity创建自己的游戏环境!了解如何通过比以往更加集成的方式使用Blender和Unity,将自己的游戏设计变为现实.在Unity中创建测试版本 ...