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矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下 ...
随机推荐
- jupyter安装小结
jupyter安装小结 更新时间:2016年03月13日 15:42:37 投稿:hebedich 我要评论 jupyter (之前的 ipython notebook )于我的最大意义在于 ...
- python3文本读取与写入常用代码
创建文件夹: import os import shutil def buildfile(echkeyfile): if os.path.exists(echkeyfile): #创建前先判断是否存在 ...
- ELK实践
一.ElasticSearch+FileBeat+Kibana搭建平台 在C# 里面运行程序,输出日志(xxx.log 文本文件)到FileBeat配置的路径下面. 平台搭建,参考之前的随笔. Fil ...
- python下载图片超时的调查
在使用python3下载图片时, 常用的方法有urlretrieve和requests两种, 不管哪种方法在网速极慢的情况下, 会出现图片下载卡住现象.那如何解决呢? 小编根据网上提供的资料测试了几种 ...
- LIO -SCSI target
2010年底,LIO 项目获选成为新的内核态的 SCSI target,取代原有的用户态的 STGT 项目.当时有两个主要的竞争项目(LIO和SCST),都在努力将代码并入主线内核.本文将比较着两个项 ...
- Linux下搭建iSCSI共享存储的方法 TGT 方式 Debian9.5系统下
iSCSI(internet SCSI)技术由IBM公司研究开发,是一个供硬件设备使用的.可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行SCSI协议,使其能够在诸如高速 ...
- rpm命令是RPM软件包的管理工具
rpm命令是RPM软件包的管理工具.rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎.逐渐受到其他发行版的采用.RPM ...
- 利用python的matplotlib处理计算数据
#!/usr/bin/python # -*- coding: UTF-8 -*- import numpy as np import matplotlib.pyplot as plt import ...
- go语言中type的几种使用
type是go语法里的重要而且常用的关键字,type绝不只是对应于C/C++中的typedef.搞清楚type的使用,就容易理解go语言中的核心概念struct.interface.函数等的使用.以下 ...
- ubuntu之路——day7.2 regularization
所有的正则化方法来自于吴恩达老师的免费公开课:https://mooc.study.163.com/learn/2001281003?tid=2001391036#/learn/content?typ ...