hdu 3853 LOOPS

本文介绍了一个关于在一个R*C的网格中,通过概率动态规划方法来计算从起点到终点所需魔力消耗的期望值的问题。文章提供了解题思路及完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:给一个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 1024

double 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值