zoukankan      html  css  js  c++  java
  • Light OJ 1050

    题目大意:

    一个包裹里有蓝色和红色的弹珠,在这个包裹里有奇数个弹珠,你先走, 你先从背包里随机的拿走一个弹珠,拿走每个弹珠的可能性是一样的。然后Jim从背包里拿走一个蓝色的弹珠,如果没有蓝色的弹珠让Jim拿走,那么Jim赢,如果最终从包裹里移走的是蓝的弹珠,那么你赢,否则Jim赢。给你蓝色和红的背包的里弹珠的个数,求赢的概率。
     
    dp[R][B] 代表 R个红球, B个白球的时候赢得概率。当遇到 (R+B)%2 == 0 得时候直接 dp[R][B] = dp[R][B-1]就OK了。
    这里采用的是记忆化搜索,所以用起来比较方便。
     
     
     ==============================================================================================================
     
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<queue>
    #include<vector>
    #include<map>
    using namespace std;
    typedef long long LL;
    const int INF = 1e9+7;
    const int MAXN = 555;
    double dp[MAXN][MAXN];
    
    double DFS(int R,int B)
    {
        if(dp[R][B] != -1)
            return dp[R][B];
        if(R >= B || B == 0)
            return dp[R][B] = 0;
        if(R == 0)
            return dp[R][B] = 1;
        double k = 1.0/(R + B);
        if( (R+B)%2 )
            dp[R][B] =  1.0*R*k*DFS(R-1,B) + 1.0*B*k*DFS(R, B-1);
        else
            dp[R][B] = DFS(R, B-1);
    
        return dp[R][B];
    }
    
    int main()
    {
        int T, cas = 1, n, R, B;
        for(int i=0; i<=500; i++)
        for(int j=0; j<=500; j++)
        dp[i][j] = dp[i][j] = -1;
    
        scanf("%d", &T);
        while(T --)
        {
            scanf("%d %d", &R, &B);
    
            printf("Case %d: %.9lf
    ",cas ++, DFS(R, B) );
        }
    
        return 0;
    }
  • 相关阅读:
    UVA 11488 Hyper Prefix Sets (字典树)
    UVALive 3295 Counting Triangles
    POJ 2752 Seek the Name, Seek the Fame (KMP)
    UVA 11584 Partitioning by Palindromes (字符串区间dp)
    UVA 11100 The Trip, 2007 (贪心)
    JXNU暑期选拔赛
    计蒜客---N的-2进制表示
    计蒜客---线段的总长
    计蒜客---最大质因数
    JustOj 2009: P1016 (dp)
  • 原文地址:https://www.cnblogs.com/chenchengxun/p/4916274.html
Copyright © 2011-2022 走看看