zoukankan      html  css  js  c++  java
  • 题解poj2096

    首先,题目传送门

    然后,简单翻译一下:

    有n个bug,s个程序,每天能发现一个bug,求在每个程序中发现至少一个bug并将每一个bug都至少发现一次的期望天数。典型的期望dp。

    如果忘了什么是期望之类的,出门左转数学选修2-3。

    方案一:列分布列

    很不幸,我们发现在比较差的情况下,也就是总在发现同一个bug时,我们将需要无穷天才能将bug找全。也就是说分布列将有无穷项,明显不可行。

    方案二:dp[i][j]记录在j个系统中发现i个bug的期望天数

    问题和方案一一样,不再重复了

    方案三:dp[i][j]记录j个系统中发现i个bug后距成功的期望天数

    这个方案是可行的,只要输出时输出dp[0][0]即可,在这里,dp[n][s]为0,然后自大而小转移到dp[0][0]即可。

    有了状态,就需要转移方程了

    能转移到dp[i][j]的共有四种情况:

    1.新bug,新系统:值:(dp[i+1][j+1]+1),概率:(n-i)(s-j)/ns

    2.新bug,旧系统:值:(dp[i+1][j]+1),概率:i(s-j)/ns

    3.旧bug,新系统:值:(dp[i][j+1]+1),概率:(n-i)j/ns

    4.旧bug,旧系统:值:(dp[i][j]+1),概率:ij/ns

    也就是说:dp[i][j]=(dp[i+1][j+1]+1)*(n-i)(s-j)/ns+(dp[i+1][j]+1)*i(s-j)/ns+(dp[i][j+1]+1)*(n-i)j/ns+(dp[i][j]+1)*ij/ns,这时,我们发现等式两侧都有dp[i][j],我们需要把它整理出来

    原式<=>ns*dp[i][j]=(dp[i+1][j+1]+1)*(n-i)(s-j)+(dp[i+1][j]+1)*i(s-j)+(dp[i][j+1]+1)*(n-i)j+(dp[i][j]+1)*ij

      <=>(ns-ij)*dp[i][j]=(dp[i+1][j+1]+1)*(n-i)(s-j)+(dp[i+1][j]+1)*i(s-j)+(dp[i][j+1]+1)*(n-i)j+ij

      <=>(ns-ij)*dp[i][j]=dp[i+1][j+1]*(n-i)(s-j)+ns-is-nj+ij+dp[i+1][j]*i(s-j)+is-ij+dp[i][j+1]*(n-i)j+nj-ij+ij

      <=>(ns-ij)*dp[i][j]=dp[i+1][j+1]*(n-i)(s-j)+dp[i+1][j]*i(s-j)+dp[i][j+1]*(n-i)j+ns

      <=>dp[i][j]=(dp[i+1][j+1]*(n-i)(s-j)+dp[i+1][j]*i(s-j)+dp[i][j+1]*(n-i)j+ns)/(ns-ij)

    现在,我们将dp[i][j]整理了出来,现在就是代码的问题了,在发标程之前,本蒟蒻说明一件事:

    输出时要写成

    printf("%.4f",dp[0][0]);

    而不是

    printf("%.4lf",dp[0][0]);

    虽然dp数组是double,但用"%.4lf"输出就会WA,此类题目精度是非常令人头疼的,本题有spj也并未卵用。

    好了,上标程

    #include<cstdio>
    int n,s;
    double dp[1010][1010];
    int main()
    {
        scanf("%d%d",&n,&s);
        for(int i=n;i>=0;i--)
        {
            for(int j=s;j>=0;j--)
            {
                if(i!=n||j!=s)
                {
                    dp[i][j]=(dp[i+1][j+1]*(n-i)*(s-j)+dp[i+1][j]*(n-i)*j+dp[i][j+1]*i*(s-j)+n*s)/(n*s-i*j);
                }
            }
        }
        printf("%.4f",dp[0][0]);
    }
  • 相关阅读:
    Linux就该这么学28期——Day03 2.4-2.7
    Linux就该这么学28期——Day02 2.1-2.3
    Linux就该这么学28期——开篇
    层次遍历应用

    二叉树
    Linux 随手记录
    KMP算法详解(转)
    使用MySQL connector/C++链接MySQL数据库
    C++ 代码片段
  • 原文地址:https://www.cnblogs.com/Grharris/p/10349841.html
Copyright © 2011-2022 走看看