HDU 3853:LOOPS

LOOPS

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=3853

题意:

有一个网格,从点(1,1)开始走,要走到点(n,m),点(X,Y)可以走到点(X,Y),(X,Y+1),(X+1,Y),概率分别为p0,p1,p2,每走一步耗费2点魔力,求走到终点所耗费的魔力的期望

 

题解:

一道简单的求期望的题,不会求期望的可以看下这里

具体公式如下: dp[i][j]=p[i][j][0]*dp[i][j]+p[i][j][1]*dp[i][j+1]+p[i][j][2]*dp[i+1][j]

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

此题有个坑点,当点(x,y)的p0为1时,期望为无穷大,但题目保证答案会小于1000000,因此(x,y)这个点一定是到不了的

             

代码

#include<stdio.h>
#include<math.h>
const double eps=1e-3;
double p[1000][1000][3];
int main()
{
  int n,m;
  while(~scanf("%d%d",&n,&m))
  {
    for(int i=0;i<n;++i)
    for(int j=0;j<m;++j)
    scanf("%lf%lf%lf",&p[i][j][0],&p[i][j][1],&p[i][j][2]);
    p[n-1][m-1][0]=0.0;
    for(int i=n-1;i>=0;--i)
    for(int j=m-1;j>=0;--j)
    if(i!=n-1||j!=m-1)
    {
      double x=1-p[i][j][0];
      p[i][j][0]=0.0;
      if(fabs(x)<eps)continue;
      if(i<n-1)p[i][j][0]+=p[i][j][2]*p[i+1][j][0];
      if(j<m-1)p[i][j][0]+=p[i][j][1]*p[i][j+1][0];
      p[i][j][0]+=2.0;
      p[i][j][0]/=x;
    }
    printf("%.3f\n",p[0][0][0]);
  }
}

  

posted @ 2016-06-08 20:09  kiuhghcsc  阅读(158)  评论(0编辑  收藏  举报