博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ1419】 Red is good [期望DP]
阅读量:5339 次
发布时间:2019-06-15

本文共 1340 字,大约阅读时间需要 4 分钟。

Red is good

Time Limit: 10 Sec  Memory Limit: 64 MB
[][][]

Description

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

Input

  一行输入两个数R,B。

Output

  在最优策略下平均能得到多少钱。输出答案时,小数点后第六位后的全部去掉,不要四舍五入。

Sample Input

  5 1

Sample Output

  4.166666

HINT

  R,B<=5000

Solution

  这显然是一道简单的期望DP。我们令 f[i][j] 表示剩下 i 个红牌和 j 个黑牌时的最优答案。那么显然:

  

  其中 i/(i+j) 和 j/(i+j) 表示选择到的概率。

  最后由于卡内存,我们滚动一下数组即可。

Code

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 using namespace std; 9 typedef long long s64; 10 11 const int ONE = 5001;12 const int E6 = 1e6;13 14 int n,m;15 double f[2][5001];16 17 int get() 18 {19 int res=1,Q=1; char c;20 while( (c=getchar())<48 || c>57)21 if(c=='-')Q=-1;22 if(Q) res=c-48; 23 while((c=getchar())>=48 && c<=57) 24 res=res*10+c-48; 25 return res*Q; 26 }27 28 29 int main()30 {31 n=get(); m=get();32 for(int i=0,A=0; i<=n; i++,A^=1)33 {34 f[A][0] = i;35 for(int j=0; j<=m; j++)36 f[A][j] = max(0.0, (double)i/(i+j) * (f[A^1][j]+1) + (double)j/(i+j) * (f[A][j-1]-1) );37 }38 s64 record = floor(f[n&1][m] * E6);39 printf("%lld.%06lld", record/E6, record%E6);40 }
View Code

 

转载于:https://www.cnblogs.com/BearChild/p/6651440.html

你可能感兴趣的文章
建造者模式
查看>>
ArraySort--冒泡排序、选择排序、插入排序工具类demo
查看>>
composer 安装laravel
查看>>
8-EasyNetQ之Send & Receive
查看>>
Android反编译教程
查看>>
java重写LinkedList
查看>>
zTree节点重叠或者遮挡
查看>>
List<string> 去重复 并且出现次数最多的排前面
查看>>
js日志管理-log4javascript学习小结
查看>>
Android之布局androidmanifest.xml 资源清单 概述
查看>>
How to Find Research Problems
查看>>
Linux用户管理
查看>>
数据库第1,2,3范式学习
查看>>
《Linux内核设计与实现》第四章学习笔记
查看>>
使用iperf测试网络性能
查看>>
struts2入门之准备工作
查看>>
从C语言的弱类型属性说起
查看>>
图片的显示隐藏(两张图片,默认的时候显示第一张,点击的时候显示另一张)...
查看>>
Docker 安装MySQL5.7(三)
查看>>
python 模块 来了 (调包侠 修炼手册一)
查看>>