HDU 3853 LOOPS(概率dp)

题目链接:HDU 3853 LOOPS

概率dp。

这个题的状态转移挺好想的,但是开始一直过不了,后来看了这道题的讨论版才知道怎么回事,那上边说只要A点满足停留在该点的概率为1,那么肯定没有点可以走入A点,这是题目里面比较大的一个陷阱,因为如果有点可以走入A点,那么最后所求的期望一定是正无穷和题目中结果小于100000违背。那么这个A点的概率是不用计算的。这也是不算那个点答案不会错的原因。要是直接算了就WA了,我想可能是除0错误或者除了一个很小的数后溢出什么的的吧。

还有记得移项啊。。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;

const int MAX_N = 1000 + 10;
const double e = 1e-9;

struct Point
{
    double dp, x, y, z;
};
Point p[MAX_N][MAX_N];

int n, m;

int main()
{
    while(scanf("%d%d", &n, &m) != EOF)
    {
        p[n][m].dp = 0.0;
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= m; j++)
                scanf("%lf%lf%lf", &p[i][j].x, &p[i][j].y, &p[i][j].z);
        for(int i = n; i > 0; i--)
        {
            for(int j = m; j > 0; j--)
            {
                if((i == n && j == m) || fabs(p[i][j].x - 1.0) < e)
                    continue;
                p[i][j].dp = (2 + p[i][j + 1].dp * p[i][j].y + p[i + 1][j].dp * p[i][j].z) / (1.0 - p[i][j].x);
            }
        }
        printf("%.3lf\n", p[1][1].dp);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值