hdu3853:LOOPS

题目大意:r*c个点,每个点有Aij的概率回到自己本身,Bij的概率向右一格,Cij的概率向下一格,求从(1,1)到(r,c)的期望步数。

题解:有了hdu4405的经验,从后往前推期望。那么,E(i,j)=E(i,j)*Aij+E(i,j+1)*Bij+E(i+1,j)*Cij+2,注意加上“又消耗了两点”,闪一下,变成E(i,j)=(E(i,j+1)*Bij+E(i+1,j)*Cij+2)/(1-Aij),问题马上产生!!!当Aij=1怎么办呢?

注意到Aij=1时,走进这个格就再也走不出来。因此你可以把到(i,j)的期望置0。这样,在计算期望的时候若用到这个点,可以当它不存在,不存在从到达这个点的情形。

它让你烦躁,为何不忽视它?

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 
 8 int n,m;
 9 #define maxn 1011
10 #define eps 1e-9
11 double E[maxn][maxn],A[maxn][maxn],B[maxn][maxn],C[maxn][maxn];
12 int main()
13 {
14     while (scanf("%d%d",&n,&m)==2)
15     {
16         for (int i=1;i<=n;i++) for (int j=1;j<=m;j++)
17             scanf("%lf%lf%lf",&A[i][j],&B[i][j],&C[i][j]);
18         E[n][m]=0.0;
19         for (int i=n;i>0;i--) for (int j=m;j>0;j--)
20         {
21             if (i==n && j==m) continue;
22             if (fabs(A[i][j]-1)<eps) continue;
23             E[i][j]=(B[i][j]*E[i][j+1]+C[i][j]*E[i+1][j]+2.0)/(1-A[i][j]);
24         }
25         printf("%.3lf\n",E[1][1]);
26     }
27     return 0;
28 }
View Code

 

posted @ 2017-01-01 23:58  Blue233333  阅读(142)  评论(0编辑  收藏  举报