1 /* 2 题目大意:一个n*m的棋盘,每天放一个棋子,每行每列至少有一个棋子时结束。求达到每行每列至少有一个棋子的天数的数学期望。 3 */ 4 #include <iostream> 5 #include <cstdio> 6 #include <cstring> 7 using namespace std; 8 9 const int maxn=55; 10 double dp[maxn*maxn][maxn][maxn];//放i颗棋子,j行有棋子,k列有棋子 11 12 int main() 13 { 14 int t,n,m,i,j,k; 15 scanf("%d",&t); 16 while(t--) 17 { 18 scanf("%d%d",&n,&m); 19 memset(dp,0,sizeof(dp)); 20 dp[0][0][0]=1; 21 int top=n*m; 22 for(i=1;i<=top;i++) 23 { 24 for(j=1;j<=i && j<=n;j++) 25 { 26 for(k=1;k<=i && k<=m;k++) 27 { 28 dp[i][j][k]=dp[i-1][j][k-1]*((m-k+1)*j)/(n*m-i+1)+//原有行,新的列中 29 dp[i-1][j-1][k]*((n-j+1)*k)/(n*m-i+1)+//原有列,新的行中 30 dp[i-1][j-1][k-1]*((n-j+1)*(m-k+1))/(n*m-i+1);//新的行,新的列中 31 if(!(n==j && m==k))//没到终点可以放在原有行,原有列中 32 dp[i][j][k]+=dp[i-1][j][k]*(j*k-i+1)/(n*m-i+1); 33 } 34 } 35 } 36 double ans=0; 37 for(i=1;i<=top;i++) 38 ans+=dp[i][n][m]*i; 39 printf("%.10lf\n",ans); 40 } 41 return 0; 42 }
时间: 2024-10-27 03:56:43