随笔 - 148, 文章 - 0, 评论 - 1, 阅读 - 36183

导航

< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

Codeforces 28C [概率DP]

Posted on   tun~  阅读(265)  评论(0编辑  收藏  举报
复制代码
/*
大连热身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\n",ans);
}
复制代码

 

编辑推荐:
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
阅读排行:
· 不到万不得已,千万不要去外包
· C# WebAPI 插件热插拔(持续更新中)
· 会议真的有必要吗?我们产品开发9年了,但从来没开过会
· 【译】我们最喜欢的2024年的 Visual Studio 新功能
· 如何打造一个高并发系统?
点击右上角即可分享
微信分享提示