zoukankan      html  css  js  c++  java
  • URAL 1994 The Emperor's plan

    期望$dp$。

    $dp[i][j]$表示第$1$种人有$i$个,第$2$种人有$j$个的情况下,到达目标状态的期望值。初始化$dp[i][0]=i$。

    枚举一下这个状态死多少人,取个$max$,最后$dp[n-k][k]$就是答案。

    #include<map>
    #include<set>
    #include<ctime>
    #include<cmath>
    #include<queue>
    #include<string>
    #include<vector>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<functional>
    using namespace std;
    #define ms(x,y) memset(x,y,sizeof(x))
    #define rep(i,j,k) for(int i=j;i<=k;i++)
    #define per(i,j,k) for(int i=j;i>=k;i--)
    #define loop(i,j,k) for (int i=j;i!=-1;i=k[i])
    #define inone(x) scanf("%d",&x)
    #define intwo(x,y) scanf("%d%d",&x,&y)
    #define inthr(x,y,z) scanf("%d%d%d",&x,&y,&z)
    #define infou(x,y,z,p) scanf("%d%d%d%d",&x,&y,&z,&p)
    #define lson x<<1,l,mid
    #define rson x<<1|1,mid+1,r
    #define mp(i,j) make_pair(i,j)
    #define ft first
    #define sd second
    typedef long long LL;
    typedef pair<int, int> pii;
    const int low(int x) { return x&-x; }
    const int INF = 0x7FFFFFFF;
    const int mod = 1e9 + 7;
    const int N = 1e6 + 10;
    const int M = 1e4 + 1;
    const double eps = 1e-10;
    
    double dp[210][210];
    double c[210][210];
    
    int n,k;
    
    void init()
    {
        c[0][0]=1;
        for(int i=1;i<=200;i++)
        {
            c[i][0]=1;
            c[i][i]=1;
            for(int j=1;j<=200;j++)
            {
                c[i][j] = c[i-1][j] + c[i-1][j-1];
            }
        }
    }
    
    int main()
    {
        init();
        while(~scanf("%d%d",&n,&k))
        {
            memset(dp,0,sizeof dp);
            for(int i=1;i<=n-k;i++) dp[i][0]=1.0*i;
    
            for(int i=0;i<=n-k;i++)
            {
                for(int j=0;j<=k;j++)
                {
                    if(j==0) continue;
    
                    int pn = i-j;
                    int pk = j;
    
                    for(int p=1;p<=pn+pk;p++)
                    {
                        double sum=0;
                        for(int L=0;L<=pn;L++)
                        {
                            int R = p-L;
                            if(R<0) break;
                            if(pk<R) continue;
                            sum=sum+dp[pn-L][pk-R]*c[pn][L]*c[pk][R]/c[pn+pk][p];
                        }
                        dp[i][j]=max(sum,dp[i][j]);
                    }
                }
            }
    
            printf("%.10f
    ",dp[n-k][k]);
    
        }
        return 0;
    }
  • 相关阅读:
    《全职高手》的全部职业和职业技能(最新版)
    博客园样式美化
    科幻电影免费百度云分享(Scince-fiction cloud share)
    阅读须知
    Website's Game source code
    #P2010 回文日期 的题解
    #P1909 买铅笔 的题解
    #P4770 [NOI2018]你的名字 的题解
    #1074 骑士问题 的题解
    [C++基本语法:从菜鸟变成大佬系列,就像1,2,3那么简单](七):C++的修饰符
  • 原文地址:https://www.cnblogs.com/zufezzt/p/6696289.html
Copyright © 2011-2022 走看看