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

 

转载于:https://www.cnblogs.com/Blue233333/p/6241857.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值