开始时直接设了一个状态,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 ",dp[0][0]); } return 0; }