• 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
    ",E[1][1]);
    26     }
    27     return 0;
    28 }
    View Code
  • 相关阅读:
    自定义博客园skin
    c++11: <thread>学习
    《明日方舟》Python版公开招募工具
    Python列表
    Python基础
    C#常用修饰符
    C#单例类的实现
    云服务器反黑客入侵攻防实录(一)
    在CentOS7.6上安装自动化运维工具Ansible以及playbook案例实操
    技术漫谈 | 远程访问和控制云端K8S服务器的方法
  • 原文地址:https://www.cnblogs.com/Blue233333/p/6241857.html
Copyright © 2020-2023  润新知