题意:n*m的棋盘,每天放一个棋子,直到每行每列都有棋子时不再放,问所放棋子个数的期望。
分析:概率dp,dp[a][b][k]表示用k个棋子占据a行b列还需棋子的期望,具体转移看代码。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<set>
#include<queue>
#define inf 1000000000
#define eps 1e-8
using namespace std;
const int maxn=100005;
int n,m;
double dp[55][55][55*55];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=n;i>=0;i--)
{
for(int j=m;j>=0;j--)
{
for(int k=i*j;k>=max(i,j);k--)
{
if(i==n&&j==m)
{
dp[i][j][k]=0;
continue;
}
dp[i][j][k]=0;
dp[i][j][k]+=dp[i][j][k+1]*(i*j-k)/(n*m-k);
dp[i][j][k]+=dp[i][j+1][k+1]*(i*(m-j))/(n*m-k);
dp[i][j][k]+=dp[i+1][j][k+1]*((n-i)*j)/(n*m-k);
dp[i][j][k]+=dp[i+1][j+1][k+1]*((n-i)*(m-j))/(n*m-k);
dp[i][j][k]+=1;
}
}
}
printf("%.12lf\n",dp[0][0][0]);
}
return 0;
}