首页 > 其他分享 >Red is good

Red is good

时间:2024-05-29 10:33:20浏览次数:27  
标签:good 红牌 题解 样例 停止 dp 黑牌 Red

事先说明,看的题解

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

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

输出格式
在最优策略下平均能得到多少钱。

样例
样例输入
5 1
样例输出
4.166666
数据范围与提示
输出答案时,小数点后第六位后的全部去掉,不要四舍五入.

…………
很显然啊,我不会
根据本题(和题解),可以发现,最优策略是指如果发现抽牌亏的概率平均下来特别大,那么就直接停止,例如你在知道剩下的都是黑牌,那么你肯定不会去抽,或者有一万张黑牌,有两张红牌,那么你也一定不会去冒这个险
根据绿豆蛙和osu,可以想到利用期望的线性性质从上一个状态转移到本状态来,一开始想了一个抽象的dp,以剩下i张牌的期望为f[i]:
\(f[i]=(f[i-1]+1)*p[i]-f[i-1]*(1-p[i])\)

截止条件就是红牌数为0

但很明显不对,首先是没有把红和黑分开(总不能一直抽红吧),其次是抽黑牌应该是\((f[i-1]-1)*(1-p[i])\),最后是我停止不一定就是没红牌了,根据上面的口胡会发现,如果我亏的概率大也会停止,然后就去看题解了

正题开始

既然我没法根据剩余的牌来推,那么就反着来,根据我现有的牌(假设我要抽的只是牌堆中的一部分牌)来建dp,令f[i][j]为我从i张红牌,j张黑牌抽牌的期望,那么转移方程就是:
\(f[i][j]=(f[i-1][j]+1)*p[i]+(f[i][j-1]-1)*(1-p[i])\)
\(p[i]=i/(i+j)\)
但这个方程没有考虑停止的情况,也就是说,他会一直抽,直到牌堆中没牌,那么我们就需要即时停止,对于这个里面的f[i][j],如果它停止,说明在这种情况下就根本不能抽(即期望值为负),因此考虑将它的值赋为0,即在这个状态下没抽
那么就有:
\(f[i][j]=max( 0, ( f[i-1][j]+1)*p[i]+(f[i][j-1]-1)*(1-p[i]) )\)

本来到这里就应该结束了,但很显然有个疑问,假设我f[i-1][j]的期望为负,理应来讲它被赋为了0,那不应该停止吗?为什么还会用于f[i][j]的计算?
实际上,这里的dp只是揭露了整个计算过程的一半,这里从计算到输出结果实际上是一个递归
image
也就是说,这里的DP实际上反映的是递归回来的过程,而并非真的计算转移(我认为),因此这个转移方程没有问题,0就是停止的状态

没了
#include<bits/stdc++.h>
using namespace std;
double f[5001][5001];
int n,m;
 double p; 
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		f[i][0]=i; 
		for(int j=1;j<=m;j++){
			p=(double)i/(i+j);
			f[i][j]=max(0.0,((f[i-1][j]+1)*p+(f[i][j-1]-1)*(1.0-p)));
		}
	}
	cout<<setprecision(6)<<fixed<<f[n][m]-0.0000005<<endl;
}

标签:good,红牌,题解,样例,停止,dp,黑牌,Red
From: https://www.cnblogs.com/PeppaEvenPigShiGeNiuBDePig/p/18219668

相关文章

  • redis数据类型之string,list
    华子目录key操作说明`SCANcursor[MATCHpattern][COUNTcount]``dump`与`restore``keys通配符`示例演示`string`说明`setbitkeyoffsetvalue``getbitkeyoffset``setrangekeyoffsetvalue``List`结构图相关命令`lremkeycountvalue``ltrimkeycountvalu......
  • Learning Model Predictive Control for Iterative Tasks. A Data-Driven Control Fra
    LearningModelPredictiveControlforIterativeTasks.AData-DrivenControlFramework一句话MPC:在每个采用点处,根据被控对象的状态和预测模型,预测系统在未来一段时间内的状态,依据某一性能指标(成本函数)来求解最优的一组控制序列,并将这组控制序列的第一个控制作用作为输出......
  • hadoop学习之MapReduce案例:输出每个班级中的成绩前三名的学生
    hadoop学习之MapReduce案例:输出每个班级中的成绩前三名的学生所要处理的数据案例:1500100001施笑槐,22,女,文科六班,4061500100002吕金鹏,24,男,文科六班,4401500100003单乐蕊,22,女,理科六班,3591500100004葛德曜,24,男,理科三班,4211500100005宣谷芹,22,女,理科......
  • redis 安装、使用手册
    Linux系统Redis使用手册一、引言Redis是一个开源的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息代理。由于其出色的性能和灵活性,Redis在开发社区中广受欢迎。本手册将详细介绍Redis在Linux系统中的安装、每种数据结构的命令使用以及每种数据类型的应用场景。二......
  • 测试C#GDI+双缓冲高效绘图--BufferedGraphicsContext
    奥斯卡好的b、测试C#GDI+双缓冲高效绘图```#regionC#GDI+双缓冲高效绘图#regiontemp//Rectanglerectangle=e.ClipRectangle;//取出次窗体或者画布的有效区的矩形区域//BufferedGraphicsContextGraphicsContext=BufferedGraphicsM......
  • Red is good
    Description桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。Input一行输入两个数R,B,其值在0到5000之间Output在最优策略下平均能得到多少钱。解析设计状态:\(f[i]......
  • Redis如何进行内存优化
    控制key的数量。当使用Redis存储大量数据时,通常会存在大量键,过多的键同样会消耗大量内存。Redis本质是一个数据结构服务器,它为我们提供多种数据结构,如hash,list,set,zset等结构。使用Redis时不要进入一个误区,大量使用get/set这样的API,把Redis当成Memcached使用。对于存储相同的......
  • redis的6.2.14的docker安装
    1.拉取镜像dockerpullredis:6.2.142.运行镜像sudodockerrun--nameredis-d-p6379:6379\-v/home/cy/soft/redis/data:/data\-v/home/cy/soft/redis/conf/redis-docker.conf:/usr/local/etc/redis/redis.conf\--privileged=true\redis:6.2.14redis-server/usr/lo......
  • Redis配置文件说明及主从配置
    目录1、redis.conf配置文件说明2、主服务器配置3、从机配置4、查看主从配置信息1、redis.conf配置文件说明daemonizeno--是否把redis-server启动在后台,默认是“否”。若改成yespidfile/var/run/redis.pid--当Redis以守护进程方式运行时,Redis默认会把pid写入/var......
  • 赶紧收藏!2024 年最常见 20道 Redis面试题(九)
    上一篇地址:赶紧收藏!2024年最常见20道Redis面试题(八)-CSDN博客十七、如何使用Redis做异步队列?使用Redis作为异步队列主要依赖于Redis的列表(list)数据结构,列表提供了原子的推入(push)和弹出(pop)操作,这使得它非常适合实现队列。以下是使用Redis实现异步队列的步骤:准备Red......