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


你可能感兴趣的:(HDU 3853 LOOPS(概率dp))