题意
【题意】
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≤15
【输入样例】
1 2 3 4
【输出样例】
16.393
题解
这道题目乍一看特别难,一看入门,我佛了,被入门题吊着打。
看了题解才会。
f [ a ] [ b ] [ c ] [ d ] [ q ] [ p ] f[a][b][c][d][q][p] f[a][b][c][d][q][p],当 q = = 0 , p = = 0 q==0,p==0 q==0,p==0时,这个表示的是期望拿几张牌能使得目前的牌堆满足要求。
那么 q q q表示的就是小王了,当他等于 0 0 0,表示没找到,当他等于 1 4 1~4 1 4时,分别表示化作什么花色。
而 p p p同理。
然后DP方程(sum表示拿的牌数):
方程来自:https://blog.csdn.net/Ronaldo7_ZYB/article/details/89526291
当然这坨式子这么长,当然用记忆化搜索是最简单实现的啦。
<