首页 > 代码库 > POJ 2906 数学期望

POJ 2906 数学期望

开始时直接设了一个状态,dp[i][j]为发现i种bug,j个系统有bug的期望天数。但很错误,没能转移下去。。。。

看了题解,设状态dp[i][j]为已发现i种bug,j个系统有bug,到完成目标状态所需要的期望的天数。妙啊,这样一设状态,就很好更解了。如,由dp[i][j]

可以到达状态dp[i][j+1],则到达它的概率很明显可求出为p=(i/n)*((s-j)/s),则是,需要dp[i][j+1](期望)天数的概率就是p。这就很容易理解了啊,高!高!高!

由dp[i][j]可以转移出四个状态,分别是a1=dp[i][j],a2=dp[i+1][j+1],a3=dp[i][j+1],a4=dp[i+1][j]。分别对应概率p1,p2...

则有方程dp[i][j]=sum(ai*pi)+1.最后要加1是因为,必须要花费一天。

于是,

#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int N=1010;double dp[N][N];int main(){    int n,s;    while(~scanf("%d%d",&n,&s)){        dp[n][s]=0;        for(int i=n;i>=0;i--)            for(int j=s;j>=0;j--){                if(i==n && j==s)                    continue;                dp[i][j]=(i*(s-j)*dp[i][j+1]+(n-i)*j*dp[i+1][j]+(n-i)*(s-j)*dp[i+1][j+1]+n*s)/(n*s-i*j);            }        printf("%.4f\n",dp[0][0]);    }    return 0;}

  

POJ 2906 数学期望