zoukankan      html  css  js  c++  java
  • Codeforces 28C [概率DP]

    /*
    大连热身D题
    题意:
    有n个人,m个浴室每个浴室有ai个喷头,每个人等概率得选择一个浴室。
    每个浴室的人都在喷头前边排队,而且每个浴室内保证大家都尽可能均匀得在喷头后边排队。
    求所有浴室中最长队伍的期望。
    
    思路:
    概率dp dp[i][j][k]代表前i个浴室有j个人最长队伍是k的概率。
    枚举第i个浴室的人数。然后转移的时候其实是一个二项分布。
    
    */
    
    
    #include<bits/stdc++.h>
    using namespace std;
    int jilu[55];
    double dp[55][55][55];
    double C[55][55];
    void init() {
        C[0][0] = 1;
        for ( int i = 1; i <= 50; i++ )
        {
            C[i][0] = 1;
            for (int j = 1; j <= i; j++)
                C[i][j] = C[i-1][j-1] + C[i-1][j];
        }
    }
    int main()
    {
        int n,m;
        init();
        scanf("%d%d",&m,&n);
        for(int i=1;i<=n;i++)scanf("%d",jilu+i);
        dp[0][0][0]=1;
        for(int i=1;i<=n;i++){
            for(int j=0;j<=m;j++){
                for(int k=0;k<=m;k++){
                    for(int c=0;c<=j;c++){
                        if(c<=(k-1)*jilu[i]){
                            dp[i][j][k]+=dp[i-1][j-c][k]*C[j][c]/pow(i,j)*pow(i-1,j-c);
                        }
                        else if(c<=k*jilu[i]){
                            for(int w=0;w<=k;w++){
                                dp[i][j][k]+=dp[i-1][j-c][w]*C[j][c]/pow(i,j)*pow(i-1,j-c);
                            }
                        }
                        else break;
                    }
                }
            }
        }
        double ans=0;
        for(int i=1;i<=m;i++){
            ans+=i*dp[n][m][i];
        }
        printf("%.12lf
    ",ans);
    }
  • 相关阅读:
    NYOJ 10 skiing DFS+DP
    51nod 1270 数组的最大代价
    HDU 4635 Strongly connected
    HDU 4612 Warm up
    POJ 3177 Redundant Paths
    HDU 1629 迷宫城堡
    uva 796
    uva 315
    POJ 3180 The Cow Prom
    POJ 1236 Network of Schools
  • 原文地址:https://www.cnblogs.com/tun117/p/6002049.html
Copyright © 2011-2022 走看看