【bzoj1419】Red is good

问题描述

桌面上初始有NN张红牌,MM张黑牌,随机打乱顺序。之后我们一张一张地去翻牌,翻到红牌得到11幻想乡币,黑牌则付出11幻想乡币。可以随时停止翻牌。在最优策略下,我们得到的幻想乡币的数量期望是多少。

输入格式

一行两个非负整数,表示NN和MM。

输出格式

一个数表示答案。

样例输入

1 1

样例输出

0.5

提示

如果第一张是红牌,那直接停止游戏。收益为1,这种情况的概率是1/2。如果第一张是黑牌,继续翻下去,第二张一定是红牌。收益为0,这种情况的概率是1/2。与答案的差值≤105即视为正确。

【数据规模及约定】

30%的数据保证n,m≤10;

60%的数据保证n,m≤100;

100%的数据保证n,m≤1000。

题解

f[i][j]表示剩下i张红牌,j张黑牌的最大期望值,

f[i][j]=max(((f[i-1][j]+1)*i+(f[i][j-1]-1)*j)/(i+j),0)

如果当前翻的是红牌,收益为f[i-1][j]+1,概率为i/(i+j),期望为(f[i-1][j]+1)*i/(i+j)

如果当前翻的是黑牌,收益为(f[i][j-1]-1,概率为j/(i+j),期望为(f[i-1][j]+1)*j/(i+j)

总期望为(f[i-1][j]+1)*i/(i+j)+ (f[i-1][j]+1)*j/(i+j)

即((f[i-1][j]+1)*i+(f[i][j-1]-1)*j)/(i+j)

初始化 f[0][j]=0  f[i][0]=i

为什么要和零比较呢?

翻牌可以随时停止,那么最优策略就是保证期望非负。

即如果当前翻完牌后期望为负,那么显然不翻更优。

所以如果当前期望为负,就置为零。

 1 #include <cstdio>
 2 double f[1005][1005];
 3 int n,m;
 4 double max(double x,double y)
 5 {
 6     return x>y?x:y;
 7 }
 8 int main()
 9 {
10     int i,j;
11     scanf("%d%d",&n,&m);
12     for (i=1;i<=n;i++) f[i][0]=i*1.0;
13     for (i=1;i<=n;i++)
14       for (j=1;j<=m;j++)
15         f[i][j]=max(((f[i-1][j]+1)*i+(f[i][j-1]-1)*j)/(i+j),0.0);
16     printf("%.8f",f[n][m]);
17     return 0;
18 }

原文地址:https://www.cnblogs.com/rabbit1103/p/9737500.html

时间: 2024-10-11 10:38:30

【bzoj1419】Red is good的相关文章

【BZOJ-1419】Red is good 概率期望DP

1419: Red is good Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 660  Solved: 257[Submit][Status][Discuss] Description 桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元.可以随时停止翻牌,在最优策略下平均能得到多少钱. Input 一行输入两个数R,B,其值在0到5000之间 Output 在最优策略下平均能得到多少钱

【BZOJ1419】 Red is good [期望DP]

Red is good Time Limit: 10 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description 桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元.可以随时停止翻牌,在最优策略下平均能得到多少钱. Input 一行输入两个数R,B. Output 在最优策略下平均能得到多少钱.输出答案时,小数点后第六位后的全部去掉,不要四舍五入. Sample Input

【BZOJ】【1419】Red is good

数学期望/期望DP 还是戳<浅析竞赛中一类数学期望问题的解决方法>这篇论文…… $$ f[i][j]= \begin{cases} 0 &, &i==0 \\ f[i-1][j]+1 &, &i>0,j=0 \\ max\{0,(f[i-1][j]+1)*\frac{i}{i+j} + (f[i][j-1]-1)* \frac{j}{i+j}\} &, &i>0,j>0 \end{cases} $$ 然而TLE了一发……因为空间

hdoj 1312 Red and Black 【BFS】

题意:一共有四个方向,从'@'出发,找能到达'.'的个数, #是不能通过的. 策略:广搜. 这道题属于最简单的bfs了. 代码: #include<stdio.h> #include<string.h> #include<queue> using std::queue; bool vis[25][25]; char s[25][25]; int n, m; int ans = 0; struct node{ int x, y; }; node st; const int

【XSY2278】【HDU5669】the Red Sun(线段树+dijkstra)

\(Description\) 给定一张 \(N\) 个点的图, 点的标号为 \(1\) 到 \(n\) . 我们进行 \(M\) 次连边, 每次连边可以描述为 \(a\) \(b\) \(c\) \(d\) \(w:\) for i = a to b do for j = c to d do Add_Edge(i,j,w) \(Add_Edge(i,j,w)\) 表示从点 \(i\) 向点 \(j\) 连一条费用为 \(w\) 的双向边. 求点 \(1\) 到点 \(n\) 的最小花费. 为了

【BZOJ】1419 Red is good

[算法]期望DP [题解]其实把状态表示出来就是很简单的期望DP. f[i][j]表示i张红牌,j张黑牌的期望. i=0时,f[0][j]=0. j=0时,f[i][0]=i. f[i][j]=max(0,i/(i+j)*(f[i-1][j]+1)+j/(i+j)*(f[i][j-1]-1)). 直接使用期望定义式E(X)=Σpi*xi 不四舍五入就是在后一位-5. 空间限制必须用递推+滚动数组. #include<cstdio> #include<cstring> #includ

CSS选择器优先级【转】

样式的优先级 多重样式(Multiple Styles):如果外部样式.内部样式和内联样式同时应用于同一个元素,就是使多重样式的情况. 一般情况下,优先级如下: (外部样式)External style sheet <(内部样式)Internal style sheet <(内联样式)Inline style 有个例外的情况,就是如果外部样式放在内部样式的后面,则外部样式将覆盖内部样式. 示例如下: <head>     <style type="text/css&

【OpenGL】Shader实例分析(七)- 雪花飘落效果

转发请保持地址:http://blog.csdn.net/stalendp/article/details/40624603 研究了一个雪花飘落效果.感觉挺不错的.分享给大家,效果例如以下: 代码例如以下: Shader "shadertoy/Flakes" { // https://www.shadertoy.com/view/4d2Xzc Properties{ iMouse ("Mouse Pos", Vector) = (100,100,0,0) iChan

【Android】自己定义View、画布Canvas与画笔Paint

安卓自己定义View事实上非常easy. 这个View能够像<[Android]利用Java代码布局,button加入点击事件>(点击打开链接)一样.利用Java代码生成一系列的组件. 也能够配合画布Canvas与画笔Paint来使用. 以下用一个样例来说明.例如以下图,有一个自己定义布局View.里面摆放着,利用画布Canvas与画笔Paint绘制出来的蓝色正方形与红色文字. 在res\layout\activity_main.xml中.直接像摆放安卓固有组件一样,能够直接使用这个我定义组件