1 /*定义dp[i][j]作为完成i钟,j个子系统需要的天数,那么很显然dp[i][j]由四种状态转移来 2 p1 = i*j / (n*s) 3 p2 = (n-i)*j / (n*s) 4 p3 = i*(s-j) / (n*s) 5 p4 = (n-i)*(s-j) / (n*s) 6 但是对于 dp[i][j],显然此时的dp[i][j]是0,就无法转移了, 7 此时通过移项的方法,把dp[i][j] 移到左边,就能得出dp[i][j]的转移方程了 8 的状态有四种,*/ 9 #include <iostream> 10 #include <queue> 11 #include <cstring> 12 using namespace std; 13 typedef long long ll; 14 const int MAXN=1e5+5; 15 double dp[1005][1005]; 16 int main() 17 { 18 int n,s; 19 while(cin>>n>>s) 20 { 21 memset(dp,0,sizeof(dp)); 22 for(int i=n;i>=0;i--) 23 { 24 for(int j=s;j>=0;j--) 25 { 26 if(n==i&&j==s) continue; 27 double p=i*1.0/n;double q=j*1.0/s; 28 //cout <<p<<" "<<q<<endl; 29 dp[i][j]=((1-p)*(1-q)*(dp[i+1][j+1])+(1-p)*q*(dp[i+1][j])+p*(1-q)*(dp[i][j+1])+1)/(1-p*q); 30 } 31 } 32 printf("%.4lf\n",dp[0][0]); 33 } 34 return 0; 35 }