题目链接:http://poj.org/problem?id=2096
题意:一个软件的bug有两个分类标准,按照一种分为n类,按照另一种分为m类。已知任意一个bug必然属于n类中的一种,同时也属于m类中的一种。已知每天可以找到一个bug。问需要多少天可以找全n类和m类bug?
思路:f[x][y]表示找到x个n类y个m类的期望,则f[x][y]=1+(n-x)*(m-y)/(n*m)*f[x][y]+(n-x)*y/(n*m)*f[x][y-1]+x*(m-y)/(n*m)*f[x-1][y]+x*y/(n*m)*f[x-1][y-1]。
int n,m;
double f[1005][1005];
double DFS(int x,int y)
{
if(f[x][y]>-1) return f[x][y];
double temp;
if(x==0)
{
if(y==0) f[x][y]=0;
else
{
temp=1.0*y/m*DFS(x,y-1);
f[x][y]=(1+temp)/(1-1.0*(m-y)/m);
}
}
else
{
if(y==0)
{
temp=1.0*x/n*DFS(x-1,y);
f[x][y]=(1+temp)/(1-1.0*(n-x)/n);
}
else
{
temp=0;
temp+=1.0*(n-x)/n*y/m*DFS(x,y-1);
temp+=1.0*x/n*(m-y)/m*DFS(x-1,y);
temp+=1.0*x/n*y/m*DFS(x-1,y-1);
f[x][y]=(1+temp)/(1.0-1.0*(n-x)*(m-y)/(n*m));
}
}
return f[x][y];
}
int main()
{
Rush(n)
{
clr(f,-1);
RD(m);
PR(DFS(n,m));
}
return 0;
}