Red is good (DP)

本文介绍了一种博弈问题,即如何通过最优策略在混合红黑牌堆中获得最大期望收益。通过对不同情况的概率分析,利用动态规划方法求解最优期望值,并提供了两种实现算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

Problem Description

桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。 输出答案时,小数点后第六位后的全部去掉,不要四舍五入.

Input

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

Output

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

Sample Input

5 1

Sample Output

4.166666

分析

  • 题目的意思大概就是给一堆牌,有“+1”有“-1”,确定一种拿法(从上往下拿k张之后停止),对于所有这副牌的排列顺序,使最终这些得分的平均値最大,求出这个最大的平均値。(其实就是求最大的期望值)
  • 创建一个数组 E[i][j] 代表有 i 个红牌(+1)和 j 个黑牌(-1)时所能得到的最大期望值。
  • 所以对于E[i][j],我们可以由 E[i-1][j]E[i][j-1] 推出,相当于是翻一张红牌或翻一张黑牌到达当前状态。乘一下相应的概率就行了。
  • 那么就有
    \[ E_{(i,j)}=\frac{i}{i+j}*(E_{(i-1,j)}+1)+\frac{j}{i+j}*(E_{(i,j-1)}-1) \]
  • 注意,当E[i][j]求得小于零时,你当然是希望更大,于是你会将它赋值为0(可以想象宁可保证为0也不想要有可能为负数)
  • 其实,除了这样倒着推,也可以顺着推,可以自己想一想,下面程序也有(其实差不多)

程序

  • 由后面得出当前(倒着推)(被动)
#include <cstdio> 
double E[5010][5010];
int R,B;

int main(){
    scanf("%d%d",&R,&B);
    for (int i=0; i<=R; i++)
        for (int j=0; j<=B; j++){
            if (i>0) E[i][j]+=(double)i/(double)(i+j)*(E[i-1][j]+1);
            if (j>0) E[i][j]+=(double)j/(double)(i+j)*(E[i][j-1]-1);
            if (E[i][j]<0) E[i][j]=0;
        }
    printf("%.6f",E[R][B]-0.0000005);
}
  • 由当前更新后面(顺着推)(主动)
#include<cstdio> 
int R,B;
double E[5010][5010];

int main(){
    scanf("%d%d",&R,&B);
    for (int i=0; i<=R; i++){
        for (int j=0; j<=B; j++){
            if (E[i][j]<0) E[i][j]=0;
            E[i+1][j]+=(double)(i+1)/(double)(i+j+1)*(E[i][j]+1);
            E[i][j+1]+=(double)(j+1)/(double)(i+j+1)*(E[i][j]-1);
        }
    }
    printf("%.6f",E[R][B]-0.0000005);
}

注意

  • 题目中要求的是第六位之后的数直接去掉,不要求四舍五入,可以用到ans-0.0000005这一小技巧。
  • 记住一点:

和的期望等于期望的和

转载于:https://www.cnblogs.com/hehepig/p/6685713.html

要将Red is部署到Docker容器中,可以按照以下步骤操作: 1. 安装Docker。可以从官方网站下载和安装适用于您操作系统版本的Docker。 2. 下载Red is源代码。可以从Red is的GitHub页面下载最新版本的源代码。 3. 创建Dockerfile。在Red is源代码根目录下创建一个名为Dockerfile的文件,并添加以下内容: ``` FROM python:3.7 WORKDIR /app COPY requirements.txt /app/ RUN pip install --no-cache-dir -r requirements.txt COPY . /app/ EXPOSE 5000 CMD ["python", "app.py"] ``` 这个Dockerfile使用Python 3.7作为基础镜像,并在容器中创建了一个/app目录。然后,它将requirements.txt文件复制到容器中,并在容器中安装所需的Python依赖项。最后,它将整个Red is源代码复制到容器中,并将容器的端口暴露到5000。 4. 构建Docker镜像。在Dockerfile所在的目录中打开终端,运行以下命令来构建Docker镜像: ``` docker build -t red-is . ``` 这个命令会使用Dockerfile文件构建一个名为red-is的新镜像。构建过程可能需要一些时间。 5. 运行容器。运行以下命令来启动Red is容器: ``` docker run -p 5000:5000 red-is ``` 这个命令会在本地端口5000上启动一个新的Red is容器,并将容器的端口映射到主机的5000端口。现在,您可以通过浏览器访问http://localhost:5000来访问Red is应用程序。 请注意,这只是一个基本的Docker部署示例。您可能需要根据您的具体情况对Dockerfile进行更改。此外,如果您需要在生产环境中部署Red is,建议您使用Docker Compose或其他容器编排工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值