zoukankan      html  css  js  c++  java
  • bzoj1419 Red is good

    1419: Red is good

    Time Limit: 10 Sec  Memory Limit: 64 MB
    Submit: 1195  Solved: 554
    [Submit][Status][Discuss]

    Description

    桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付
    出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。

    Input

    一行输入两个数R,B,其值在0到5000之间

    Output

    在最优策略下平均能得到多少钱。

    Sample Input

    5 1

    Sample Output

    4.166666

    HINT

    输出答案时,小数点后第六位后的全部去掉,不要四舍五入.

    分析:很明显这是一道dp题.

       我一开始想的状态是f[i][j]表示还剩i张红牌,j张黑牌时的期望. 那么f[i][j] = (i + 1) / (i + j + 1) * (f[i + 1][j] + 1) + (j + 1) / (i + j + 1) * (f[i][j + 1] - 1).  如果停止翻牌了,f[i][j] = 0.

       这样会有一个问题:如果已经停止翻牌了,f[i][j] = 0,这个状态是能够转移到其它状态去的,显然是不合法的.

       那么倒推,假设当前状态是合法的. 令f[i][j]表示已经考虑了i张红牌,j张黑牌的期望. 那么f[i][j] = i / (i + j) * (f[i - 1][j] + 1) + j / (i + j) * (f[i][j - 1] - 1). 因为要考虑到停止翻牌这种情况. 和0取max即可.这样每一个状态就都是合法的了.

       注意使用滚动数组!最后答案不进位要特殊处理一下.

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    int n,m,now,last;
    double f[2][5010];
    
    int main()
    {
        now = 0,last = 1;
        scanf("%d%d",&n,&m);
        for (int i = 0; i <= n; i++)
        {
            swap(now,last);
            f[now][0] = i;
            for (int j = 1; j <= m; j++)
            {
                double temp1 = (double)i / (double)(i + j);
                double temp2 = (double)j / (double)(i + j);
                f[now][j] = max(0.0,temp1 * (f[last][j] + 1) + temp2 * (f[now][j - 1] - 1));
            }
        }
        f[now][m] *= 1000000;
        f[now][m] = floor(f[now][m]);
        printf("%.6lf
    ",f[now][m] / 1000000);
    
        return 0;
    }
  • 相关阅读:
    log4net使用
    第二天 ado.net, asp.net ,三层笔记
    第一天上传我的前端基础笔记
    开通博客的第一天上传我的C#基础笔记。
    VS 星期作业 if else的应用 做一个受不受异性欢迎的小程序
    ****************VS编码操作实践******************
    VS基本学习之(变量与常量)
    VS的基本学习
    2016.4.10 重生
    【python之路3】if 语句
  • 原文地址:https://www.cnblogs.com/zbtrs/p/8687006.html
Copyright © 2011-2022 走看看