洛谷3501宝牌一大堆

这道题很长

一读完可以发现不是模拟题,那么这道题还有这么多情况供我们去讨论,则一般都是可以去掉一些情况的

我们发现,对任意一种和牌,如果有杠子,我们把这个杠子换成少一张牌的刻字答案是会变得更优的(很简单的列算式)

所以就不用考虑大于15张牌的情况了

对于国士无双暴力即可

对于七对子,算出每一种雀头的贡献(如果是宝牌记得乘以4,),然后从大到小排序选择即可

对于\([3\times 4 +2]\),我们没有办法列举出来每一种情况,那么此时就跟概率题没办法列举出所有样本空间一样,所以我们考虑DP

这个时候不要被蓝书上面那道扑克牌的期望题的方程给禁锢了,非要把每一种牌的数量列出来,我们这里扩宽一点思路,按照第一篇题解的方程去列

然后再说一下这个刷表法,第一篇题解的代码中有一个片段是

for(int p = 1; p <= 2; ++p) 
if(j+p<=4 && i>=2 && cnt[i+1]>=p && c1<=cnt[i]-p && c2<=cnt[i-1]-p) 
chkmax(f[i+1][j+p][k][p][c1+p], f[i][j][k][c1][c2] / C(cnt[i], c1) / C(cnt[i-1], c2) * C(cnt[i+1], p) * C(cnt[i], c1+p) * C(cnt[i-1], c2+p) * cbp(i+1, p) * cbp(i, p) * cbp(i-1, p));
//刻子*1+顺子*1

这里在转移的时候如果要把第i+1种牌弄成顺子,就要同时选第i-1种牌和第i种牌,容易知道这样是不会漏掉最优解的,也许这是刷表法经常用的操作。你不能单独只考虑第i+1种牌去弄成顺子,尽管有c1和c2,但你不知道第i种牌和第i-1种牌是否参与其他顺子的形成,所以我们直接各多选即可(其实有单出来的根本是不能够和牌的,我们的状态应该不包括这一部分,所以也要各多选择)

你可能感兴趣的:(算法)