hdu 3853 LOOPS

来源:互联网 发布:天猫跟淘宝是什么关系 编辑:程序博客网 时间:2024/05/22 02:29

题目大意:给一个R * C的格子,每个格子(i,j)到达(i,j)、(i,j+1)、(i+1,j)的概率分别为p1,p2,p3(p1+p2 +p3 = 1),每走一个格子需要花费的魔力为2,求从(1,1)走到(R,C)所需要魔力的期望。


解题思路:果然是个大水题啊~~  很容易退出状态转移方程,不过有个小trick,就是当格子(i,j)的p1=1,即格子只能留在当前的格子处时,dp[i][j] = 0; 其他 dp[i][j] = ( p[i][j][2] * dp[i][j+1] + p[i][j][3] * dp[i+1][j]  + 2) / (1- p[i][j][1])。


代码如下:


#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#define N 1024double dp[N][N];double p[N][N][4];int  main(){    int r, c;    while(~scanf("%d %d", &r, &c))    {        for(int i = 1; i <= r; i ++)        {            for(int j = 1; j <= c; j ++)            {                scanf("%lf %lf %lf", &p[i][j][1], &p[i][j][2], &p[i][j][3]);            }        }        memset(dp, 0, sizeof(dp));        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(p[i][j][1] == 1)                {                    dp[i][j] = 0;                    continue;                }                dp[i][j] = (p[i][j][2]* dp[i][j+1] + p[i][j][3] * dp[i+1][j] + 2)/ (1 - p[i][j][1]);            }        }        printf("%.3lf\n", dp[1][1]);    }    return 0;}


原创粉丝点击