【期望 概率DP】Gym - 100554D D - Domination

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;
}

猜你喜欢

转载自blog.csdn.net/qq_41037114/article/details/83039590
今日推荐