博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
概率DP RED IS GOOD
阅读量:4843 次
发布时间:2019-06-11

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

问题 J: Red is good

时间限制: 1 Sec 内存限制: 64 MB
提交: 15 解决: 7
题目描述
桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。
输入
一行输入两个数R,B,其值在0到5000之间
输出
在最优策略下平均能得到多少钱。
样例输入
5 1
样例输出
4.166666
提示
输出答案时,小数点后第六位后的全部去掉,不要四舍五入.

状态转移挺有意思的,f[i][j]表示牌堆初始有i张红牌,j张黑牌,那么转移:如果第一次抽到红牌,那么概率为i/(i+j),抽完这张红牌后还剩下i-1张红牌,j张黑牌,那不就是f[i-1][j]了么。第一次抽到黑牌以此类推。

f[i][0]=i;
f[i][j]=max(0,(f[i-1][j]+1)*i/(i+j)+(f[i][j-1]-1)*j/(i+j));
不四舍五入还是挺简单的,用int卡一下即可。

#include
#include
#include
#include
#include
using namespace std;double f[3][5005];int n,m;int main(){ cin>>n>>m; for(int i=0;i<=n;i++) { int k=i%2;f[k][0]=i; for(int j=1;j<=m;j++) f[k][j]=max(0.0,(f[k][j-1]-1.0)*(double)j/(i+j)+(f[k^1][j]+1.0)*(double)i/(i+j)); } int ans=f[n%2][m]*1000000; printf("%.6lf",(double)ans/1000000);}

转载于:https://www.cnblogs.com/QTY2001/p/7632693.html

你可能感兴趣的文章
设计模式-策略模式&状态模式&访问者模式
查看>>
python学习第三十三节(IO模型)
查看>>
linux pci 驱动小结
查看>>
BZOJ2744: [HEOI2012]朋友圈
查看>>
设计模式之抽象工厂模式
查看>>
大整数相关的几道题
查看>>
利用表格实现大图轮播
查看>>
SpringBoot集成jsp
查看>>
30分钟学会如何使用Apache Shiro
查看>>
asp.net部署时加密config文件
查看>>
想开个网店的。。学习一下vancl的分析
查看>>
DDD:在基于关系数据库的领域,聚合的边界等于并发管理的边界。
查看>>
poj 1961 Period
查看>>
BZOJ1560: [JSOI2009]火星藏宝图
查看>>
play framework 相关
查看>>
cf1008 codeforces round #535(div3) E1. Array and Segments (Easy version)
查看>>
React 学习笔记
查看>>
LeetCode_Combinations
查看>>
快手第一题
查看>>
有向图强连通分量的Tarjan算法及模板
查看>>