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
",p[0][0][0]);
}
}