【期望 概率DP】Gym - 100554D D - Domination
阿新 • • 發佈:2018-11-06
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; }