标签:style blog http color java os io for
1 2
3.0000
解题:概率dp,求期望逆着推。
一个软件有s个子系统,会产生n种bug 某人一天发现一个bug,这个bug属于一个子系统,属于一个分类 每个bug属于某个子系统的概率是1/s,属于某种分类的概率是1/n 问发现n种bug,每个子系统都发现bug的天数的期望。
dp[i][j]表示已经找到i种bug,j个系统的bug,达到目标状态的天数的期望 dp[n][s]=0;要求的答案是dp[0][0]; dp[i][j]可以转化成以下四种状态: dp[i][j],发现一个bug属于已经有的i个分类和j个系统。概率为(i/n)*(j/s); dp[i][j+1],发现一个bug属于已有的分类,不属于已有的系统.概率为 (i/n)*(1-j/s); dp[i+1][j],发现一个bug属于已有的系统,不属于已有的分类,概率为 (1-i/n)*(j/s); dp[i+1][j+1],发现一个bug不属于已有的系统,不属于已有的分类,概率为 (1-i/n)*(1-j/s); 整理便得到转移方程
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <vector> 6 #include <climits> 7 #include <algorithm> 8 #include <cmath> 9 #define LL long long 10 #define INF 0x3f3f3f 11 using namespace std; 12 const int maxn = 1010; 13 double dp[maxn][maxn]; 14 int main(){ 15 int n,s,i,j; 16 while(~scanf("%d%d",&n,&s)){ 17 dp[n][s] = 0; 18 for(i = n; i >= 0; i--){ 19 for(j = s; j >= 0; j--){ 20 if(i == n && j == s) continue; 21 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); 22 } 23 } 24 printf("%.4f\n",dp[0][0]); 25 } 26 return 0; 27 }
xtu DP Training B. Collecting Bugs,布布扣,bubuko.com
xtu DP Training B. Collecting Bugs
标签:style blog http color java os io for
原文地址:http://www.cnblogs.com/crackpotisback/p/3887268.html