题目:http://poj.org/problem?id=2096
题目好长...意思就是每次出现 x 和 y,问期望几次 x 集齐 n 种,y 集齐 s 种;
所以设 f[i][j] 表示已经有几种,转移一下即可。
代码如下:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef double db; int const xn=1005; int n,s; db f[xn][xn]; int main() { scanf("%d%d",&n,&s); for(int i=n;i>=0;i--) for(int j=s;j>=0;j--) { if(i==n&&j==s)continue; db p0=1.0*i/n*j/s,p1=1.0*(n-i)/n*j/s,p2=1.0*i/n*(s-j)/s,p3=1.0*(n-i)/n*(s-j)/s; f[i][j]=p1*f[i+1][j]+p2*f[i][j+1]+p3*f[i+1][j+1]+1; f[i][j]=f[i][j]/(1-p0); } printf("%.6f\n",f[0][0]); return 0; }