题目大意: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 ",E[1][1]); 26 } 27 return 0; 28 }