https://vjudge.net/contest/261549#problem/D
给你n*m的格子
问你每天放一个棋子
占据n行m列的期望天数是多少
裸题概率DP,开三维数组
dp【i】【j】【k】:用k个棋子占据i行j列的可能是多少
那么接下来的每一步都会有四种可能
dp[i][j][k+1]+=dp[i][j][k]*(i*j-k)/(n*m-k);
dp[i+1][j][k+1]+=dp[i][j][k]*(n-i)*j/(n*m-k);
dp[i][j+1][k+1]+=dp[i][j][k]*(m-j)*i/(n*m-k);
dp[i+1][j+1][k+1]+=dp[i][j][k]*(n-i)*(m-j)/(n*m-k);
#include <bits/stdc++.h>
using namespace std;
double dp[55][55][2555];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(dp,0,sizeof(dp));
int n,m;
scanf("%d%d",&n,&m);
dp[0][0][0]=1.0;
for(int k=0;k<=n*m;k++)
{
for(int i=0;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
if(i==n&&j==m) continue;
dp[i][j][k+1]+=dp[i][j][k]*(i*j-k)/(n*m-k);
dp[i+1][j][k+1]+=dp[i][j][k]*(n-i)*j/(n*m-k);
dp[i][j+1][k+1]+=dp[i][j][k]*(m-j)*i/(n*m-k);
dp[i+1][j+1][k+1]+=dp[i][j][k]*(n-i)*(m-j)/(n*m-k);
}
}
}
double ans=0.0;
for(int i=0;i<=n*m;i++)
{
ans+=i*dp[n][m][i];
}
printf("%.12f\n",ans);
}
return 0;
}