HDU 3853 LOOPS (概率dp)

LOOPS

Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others)

Total Submission(s): 2931    Accepted Submission(s): 1209

Problem Description

Akemi Homura is a Mahou Shoujo (Puella Magi/Magical Girl).

Homura wants to help her friend Madoka save the world. But because of the plot of the Boss Incubator, she is trapped in a labyrinth called LOOPS.

The planform of the LOOPS is a rectangle of R*C grids. There is a portal in each grid except the exit grid. It costs Homura 2 magic power to use a portal once. The portal in a grid G(r, c) will send Homura to the grid below G (grid(r+1, c)), the grid on the
right of G (grid(r, c+1)), or even G itself at respective probability (How evil the Boss Incubator is)!

At the beginning Homura is in the top left corner of the LOOPS ((1, 1)), and the exit of the labyrinth is in the bottom right corner ((R, C)). Given the probability of transmissions of each portal, your task is help poor Homura calculate the EXPECT magic power
she need to escape from the LOOPS.

Input

The first line contains two integers R and C (2 <= R, C <= 1000).

The following R lines, each contains C*3 real numbers, at 2 decimal places. Every three numbers make a group. The first, second and third number of the cth group of line r represent the probability of transportation to grid (r, c), grid (r, c+1), grid (r+1,
c) of the portal in grid (r, c) respectively. Two groups of numbers are separated by 4 spaces.

It is ensured that the sum of three numbers in each group is 1, and the second numbers of the rightmost groups are 0 (as there are no grids on the right of them) while the third numbers of the downmost groups are 0 (as there are no grids below them).

You may ignore the last three numbers of the input data. They are printed just for looking neat.

The answer is ensured no greater than 1000000.

Terminal at EOF

Output

A real number at 3 decimal places (round to), representing the expect magic power Homura need to escape from the LOOPS.

Sample Input

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

Sample Output

6.000

Source

2011 Invitational Contest Host by BUPT

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3853

题目大意:一个r*c的迷宫,每个位置有三个分别为传送到grid (r, c), grid (r, c+1), grid (r+1, c)的概率,每次要花2魔法值,求从起点(1, 1)到终点(r, c)魔法值的期望

题目分析:简单的概率dp,用p[0][i][j],p[1][i][j],p[2][i][j]分别表示每个点的三个对应概率,dp[i][j]表示从(i,j)到(r,c)魔法值的期望,则可得到转移方程:

dp[i][j]=dp[i][j] * p[0][i][j] + dp[i][j + 1] * p[1][i][j] + dp[i + 1][j] * p[2][i][j]

==> dp[i][j] = (dp[i][j + 1] * p[1][i][j] + dp[i + 1][j] * p[2][i][j]) / (1.0 - p[0][i][j])

从这个转移方程不难看出从dp[r][c]向前推就行了,dp[r][c] = 0,还有要注意分母为0的情况要特判,如果p[0][i][j] = 1,则显然是个死循环,dp[i][j] = 0

#include <cstdio>
#include <cmath>
int const MAX = 1005;
double const EPS = 1e-10;
double p[3][MAX][MAX], dp[MAX][MAX];

int main()
{
    int r, c;
    double p1, p2, p3;
    while(scanf("%d %d", &r, &c) != EOF)
    {
        for(int i = 1; i <= r; i++)
            for(int j = 1; j <= c; j++)
                scanf("%lf %lf %lf", &p[0][i][j], &p[1][i][j], &p[2][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))
                    if(fabs(p[0][i][j] - 1.0) < EPS)
                        dp[i][j] = 0;
                    else
                        dp[i][j] = (dp[i][j + 1] * p[1][i][j] + dp[i + 1][j] * p[2][i][j] + 2) / (1.0 - p[0][i][j]);
        printf("%.3f\n", dp[1][1]);
    }
}
时间: 2024-11-08 19:17:51

HDU 3853 LOOPS (概率dp)的相关文章

HDU 3853 LOOPS 概率dp(水

水水过~ #include <stdio.h> #include <cstring> #include <iostream> #include <map> #include <cmath> template <class T> inline bool rd(T &ret) { char c; int sgn; if(c=getchar(),c==EOF) return 0; while(c!='-'&&(c&l

hdu 3853 LOOPS (概率dp 逆推求期望)

题目链接 LOOPS Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others)Total Submission(s): 2630    Accepted Submission(s): 1081 Problem Description Akemi Homura is a Mahou Shoujo (Puella Magi/Magical Girl). Homura wants to h

HDU 3853 期望概率DP

期望概率DP简单题 从[1,1]点走到[r,c]点,每走一步的代价为2 给出每个点走相邻位置的概率,共3中方向,不动: [x,y]->[x][y]=p[x][y][0] ,  右移:[x][y]->[x][y+1]=p[x][y][1];  左移:[x][y]->[x+1][y]=p[x][y][2]; 问最后走到[r,c]的期望 dp[i][j]为从[i][j]点走到[r][c]的期望 有方程: dp[i][j]=    (dp[i][j]+2)*p[i][j][0]  +   (dp

LOOPS HDU - 3853 (概率dp):(希望通过该文章梳理自己的式子推导)

题意:就是让你从(1,1)走到(r, c)而且每走一格要花2的能量,有三种走法:1,停住.2,向下走一格.3,向右走一格.问在一个网格中所花的期望值. 首先:先把推导动态规划的基本步骤给出来. · 1.设变量:(注意:设置变量时,要能够使整个求解过程可以分为多个阶段.) 2.分析阶段决策,并写出决策函数.(也就是能体现前阶段决策后阶段关系的函数) 3.写出指标函数.(也是就是我们得出解的函数.) 先第一步:设置变量,我们分析这个题的是从(1,1)到(r, c)那么什么能体现"阶段"这个

HDU 3853 LOOPS (期望DP)

题意:给定一个 n * m的矩阵,然后你从 (1,1)到 (n,m),每次你有三种可能,不动,向右,向下,每次要消耗2个魔法,并且给定每个概率, 问你走出去的期望. 析:dp[i][j] 表示从 (i,j)到终点的概率.然后一路逆推回去就好. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <

[ACM] hdu 3853 LOOPS (概率DP,递推)

LOOPS Problem Description Akemi Homura is a Mahou Shoujo (Puella Magi/Magical Girl). Homura wants to help her friend Madoka save the world. But because of the plot of the Boss Incubator, she is trapped in a labyrinth called LOOPS. The planform of the

hdu 4870 Rating(概率DP&amp;高数消元)

Rating Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 714    Accepted Submission(s): 452 Special Judge Problem Description A little girl loves programming competition very much. Recently, she

HDU 4035Maze(概率DP)

HDU 4035   Maze 体会到了状态转移,化简方程的重要性 题解转自http://blog.csdn.net/morgan_xww/article/details/6776947 /** dp求期望的题. 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点1处(概率为ki) 2.找到出口,走出迷宫 (概率为ei) 3.和该点相连有m条边,随机走一条 求:走出迷宫所要走的边数的期望值. 设 E[i]表示

HDU 4089 Activation (概率dp 好题 + 难题)

Activation Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1842    Accepted Submission(s): 689 Problem Description After 4 years' waiting, the game "Chinese Paladin 5" finally comes out.