概率DP/数学期望
kuangbin总结中的第二题
大概题意:有n个子系统,s种bug,每次找出一个bug,这个bug属于第 i 个子系统的概率为1/n,是第 j 种bug的概率是1/s,问在每个子系统中至少找出一个bug,且每种bug都找到过,总共需要找到bug的总数的期望值(我擦我这破烂语文水平……还不如不翻译)
题解:http://www.cnblogs.com/kuangbin/archive/2012/10/02/2710621.html
额之前理解的有些偏差……重新梳理一下:
现在已经找到s种bug,且它们分属于n个系统,则到达目标状态(n,s)的期望为0。
若现在已经找到s-1种bug,且它们分属于n-1个系统,则到达目标状态(n,s)的期望为……
啊总之f[i][j]表示的是现在已经找到 i 种bug,且它们分属于 j 个系统,继续找一直找到(n,s)的期望(相当于从最终态【全部找完】逆推回来)
所以答案就是f[0][0]即一个bug也没找到时,到达(n,s)的期望……sigh我语文水平果然差……
//POJ 2096
#include<cstdio>
#include<cstring>
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std; double f[][];
int main(){
int n,s;
while(scanf("%d%d",&n,&s)!=EOF){
memset(f,,sizeof (f));
D(i,n,)
D(j,s,){
if (i==n && j==s) continue;
double p1=(double(s-j)*i)/n/s,
p2=(double(n-i)*j)/n/s,
p3=(double(n-i)*(s-j))/n/s,
p0=1.0-(double(i*j))/n/s;
f[i][j]=p1*f[i][j+]+p2*f[i+][j]+p3*f[i+][j+]+;
f[i][j]/=p0;
}
printf("%.4f\n",f[][]);
}
return ;
}