• RedIsGood TopCoder


    ---恢复内容开始---

    论文题:

      桌面上有 R 张红牌和 B 张黑牌,随机打乱顺序后放在桌面上,开始一张一张

    地翻牌,翻到红牌得到 1 美元,黑牌则付出 1 美元。可以随时停止翻牌,在最优
    策略下平均能得到多少钱。

    解析:

    为什么要逆推。。。请看斌神解释。。。

      dp[i][j] 代表 还剩i张红牌 和 j张黑牌时的期望钱数

    有两种操作 不翻牌 和 翻牌 如果不翻牌 则dp[i][j] = 0

    翻牌有两种情况 红牌+1 和 黑牌-1 

    当没有红牌时,我们就不拿了,这样才能保证最优

    即 i == 0时 dp[i][j] = 0;

    当存在红牌时  我们还有可能使总期望的钱数增加

    所以dp[i][j] = max(0, i/(i+j) * (dp[i-1][j] + 1) + j/(i+j) * (dp[i][j-1] - 1));

    摸了多少张红牌和黑牌都是随机的 所以下限是不确定的  上限确定 为R 和 B

    所以从0 0 开始递推到R B  

    用滚动数组写一下就好了

    #include <bits/stdc++.h>
    using namespace std;
    
    const int maxn=5010;
    class RedIsGood
    {
    public:
        double F[3][maxn];
        double getProfit(int R, int B){
            F[0][0]=0;
            int k = 0;
            for (int i=0;i<=R;i++)
            {
                k ^= 1;
                for (int j=0;j<=B;j++)
                {
                    if ((i==0)&&(j==0)) continue;
                    if (i==0) F[k][j]=0;
                    else if (j==0) F[k][j]=F[k^1][j]+1;
                    else F[k][j]=max(0.0,(1.0*i/(i+j)*(F[k^1][j]+1)+1.0*j/(i+j)*(F[k][j-1]-1)));
                }
            }
            return F[k][B];
        }
    };
    自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
  • 相关阅读:
    Java实现 LeetCode 730 统计不同回文子字符串(动态规划)
    Python long() 函数
    Python int() 函数
    Python 变量类型
    Python 基础语法
    Python 中文编码
    深度学习点云语义分割:CVPR2019论文阅读
    自动泊车技术短暂困境,前景可期
    深度学习网络模型压缩剪枝详细分析
    用OpenCV4实现图像的超分别率
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/9723209.html
Copyright © 2020-2023  润新知