A - Collecting Bugs

 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 }

猜你喜欢

转载自www.cnblogs.com/Msmw/p/11236777.html