概率与数学期望------扑克牌

Admin生日那天,Rainbow来找Admin玩扑克牌。
玩着玩着Rainbow觉得太没意思了,于是决定给Admin一个考验。
Rainbow把一副扑克牌(54张)随机洗开,倒扣着放成一摞。
然后Admin从上往下依次翻开每张牌,每翻开一张黑桃、红桃、梅花或者方块,就把它放到对应花色的堆里去。
Rainbow想问问Admin,得到A张黑桃、B张红桃、C张梅花、D张方块需要翻开的牌的张数的期望值E是多少?
特殊地,如果翻开的牌是大王或者小王,Admin将会把它作为某种花色的牌放入对应堆中,使得放入之后E的值尽可能小。
由于Admin和Rainbow还在玩扑克,所以这个程序就交给你来写了。
输入格式
输入仅由一行,包含四个用空格隔开的整数,A,B,C,D。
输出格式
输出需要翻开的牌数的期望值E,四舍五入保留3位小数。
如果不可能达到输入的状态,输出-1.000。
数据范围
0≤A,B,C,D≤150≤A,B,C,D≤15
输入样例:
1 2 3 4

输出样例:
16.393

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 14;
const double INF = 1e20;
int A, B, C, D;
double f[N][N][N][N][5][5];
double dp(int a, int b, int c, int d, int x, int y){
 double &v = f[a][b][c][d][x][y];
 if (v >= 0)   return v;
 int as = a + (x == 0) + (y == 0);
 int bs = b + (x == 1) + (y == 1);
 int cs = c + (x == 2) + (y == 2);
 int ds = d + (x == 3) + (y == 3);
  if (as >= A && bs >= B && cs >= C && ds >= D)    return v = 0;
 int sum = a + b + c + d + (x != 4) + (y != 4);
 sum = 54 - sum;
 if (sum <= 0)   return v = INF;
  v = 1;
 if (a < 13)   v += (13.0 - a) / sum * dp(a + 1, b, c, d, x, y);
 if (b < 13)   v += (13.0 - b) / sum * dp(a, b + 1, c, d, x, y);
 if (c < 13)   v += (13.0 - c) / sum * dp(a, b, c + 1, d, x, y);
 if (d < 13)   v += (13.0 - d) / sum * dp(a, b, c, d + 1, x, y);
 if (x == 4){
  double t = INF;
  for (int i = 0; i < 4; i ++)    t = min(t, 1.0 / sum * dp(a, b, c, d, i, y));
  v += t;
 }
 if (y == 4){
  double t = INF;
  for (int i = 0; i < 4; i ++)   t = min(t, 1.0 / sum * dp(a, b, c, d, x, i));
  v += t;
 }
  return v;
}
int main(){
 cin >> A >> B >> C >> D;
 memset(f, -1, sizeof f);
  double t = dp(0, 0, 0, 0, 4, 4);
 if (t > INF / 2)   t = -1;
 printf("%.3lf\n", t);
  return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值