首页 > 其他分享 >P4050 麻将 题解

P4050 麻将 题解

时间:2024-10-19 16:47:56浏览次数:1  
标签:Pr infty 13 题解 sum 胡牌 麻将 P4050 sim

不愧是 ZJOI。

题意:有 \(n\) 种麻将牌,每种四张。定义 "胡牌" 为小鸡胡或普通七小对。给定初始 \(13\) 张牌,将剩下 \(4n-13\) 张牌随机排列,问期望摸多少张牌能胡(假设采用最优决策)。\(n\le 100\)。

先考虑怎么判定是否胡牌。

\(cnt[i]\) 表示前 \(i\) 种牌能凑出多少个对子,\(f[i][j][k]\) 表示前 \(i\) 种牌,预留 \(j\) 对 \((i-1,i)\) 和 \(k\) 张 \(i\) 的最大面子数,\(g[i][j][k]\) 表示前 \(i\) 种牌,预留 \(j\) 对 \((i-1,i)\) 和 \(k\) 张 \(i\) 和一个对子的最大面子数。若 \(g[][][]\ge 4\),说明胡了。

将 \((f[i][0\sim 2][0\sim 2],g[i][0\sim 2][0\sim 2],cnt[i])\) 共同视作一个状态。\(f,g\) 的 \(j,k\) 之所以在 \(0\sim 2\) 中,是因为如果预留了 \(3\) 对 \((i-1,i)\) 等待 \(i+1\) 组成三个顺子,可以视作 \(i-1,i,i+1\) 各自组成了刻子。

转移就枚举新来了多少张牌,看用多少张 \(i+1\)、和谁搭配进行转移。建立一个专门的 "胡牌状态",如果转移后发现胡了,转移到这个胡牌状态,然后停止转移。实践证明,有效状态 \(\le 2100\) 个。
因此可以把这些有效的状态都拿出来,建立自动机。
于是解决了判定胡牌的问题:等价于在自动机上走到胡牌状态。

回到原问题。令 \(x\) 为随机变量,表示第一次胡的时候摸了几张牌。

\[\begin{aligned} E(x)&=\sum_{i=1}^{+\infty}Pr(x=i)\cdot i=\sum_{i=1}^{+\infty}Pr(x=i)\cdot \sum_{j=1}^i 1\\ &=\sum_{j=1}^{+\infty}(\sum_{i=j}^{+\infty} Pr(x=i))\\ &=\sum_{j=1}^{+\infty} Pr(x\ge j)\\ &=\sum_{j=1}^{+\infty} Pr(\text{摸 j-1 张不胡})\\ &=1+\sum_{j=0}^{+\infty}Pr(\text{摸 j 张不胡})\\ \end{aligned} \]

记 \(ans(j)\) 为从剩下 \(4n-13\) 张取 \(j\) 张(的组合),搭配前 \(13\) 张不胡的方案数。

则 \(Pr(\text{摸 j 张不胡})=\dfrac{ans(j)\cdot j!\cdot (4n-13-j)!}{(4n-13)!}\)。问题转变为求 \(ans(j)\)。

考虑问题的简化版:从 \(4n\) 张牌中选 \(j\) 张的组合,使得它们不胡的方案数。

这里就是 DP of DP 了。
换一种方式,我们不是决定下一次抽出什么牌,而是从小到大决定我们抽出几张牌。换句话说,令 \(a_i\) 为抽出 \(i\) 的张数,我们要求的是 \((a_1\sim a_n)\) 使得 \(\sum a_i=j\) 且不胡的方案数。

\(dp[i][j][k]\) 表示考虑 \(a_1\sim a_i\),此时 \(\sum a=j\),在自动机上走到状态 \(j\) 的方案数。转移时枚举 \(a_{i+1}\) 是多少。

回到原问题。令 \(b_i\) 表示前 \(13\) 张中有多少张是第 \(i\) 种牌,相当于:计数 \((a_1\sim a_n)\),使得 \(a_i\ge b_i,\sum (a_i-b_i)=j\),且不胡的方案数。

沿用上面的 DP 定义,只需要在转移时变成枚举 \(a_i-b_i\) 是多少即可。

本题卡常。在二重循环内部,每次调用一次组合数函数都会 TLE。必须在一重循环内提前把二重循环会用到的组合数存到数组里才不会 TLE。

标签:Pr,infty,13,题解,sum,胡牌,麻将,P4050,sim
From: https://www.cnblogs.com/FLY-lai/p/18466277

相关文章

  • P10532 [XJTUPC2024] 筛法 题解
    ~~打表可知答案为$n^2$~~一种几何证明,方法来自于讲评。考虑把$n^2$个整点放到坐标系中,满足$(x,y)(x\len,y\len)$。现在从原点向每个满足$(x,y)(x\perpy)$的点引出一条射线,显然每个点都会唯一的被一条射线覆盖到,因为$(\dfrac{x}{\gcd(x,y)},\dfrac{y}{\g......
  • P3571 [POI2014] SUP-Supercomputer 题解
    P3571「POI2014」SUP-Supercomputer题解一道“较”水的黑题(可一开始苦思冥想还是不会)。本蒟蒻的第一篇黑题题解,求赞。题意简化给定一棵$n$个节点、根节点为$1$的有根树。$q$次询问中每次给定一个$k$,输出需要最少用几次操作次数删除完整棵树。每次操作可以选择删......
  • P6533 [COCI2015-2016#1] RELATIVNOST 题解
    考虑当$q=0$时怎么做。注意到性质$c\le20$,因此不妨正难则反,将**至少有$c$个人购买彩色画**的方案数转化为总方案数减去**不足$c$人购买彩色画的方案数**。这个是一个类似凑数的dp,不妨考虑背包。我们有$f_{i,j}$表示前$i$人中**恰好**$j$人购买彩色画的方......
  • [CF1616H] - Keep XOR Low 的题解
    一道比较神奇的题目,状态显得比较扯淡,但是就是能过!先建立出trie树,设\(dp_u\)表示以\(u\)为根的子树内的答案。但我们发现,若\(x\)的当前位为\(1\),那么问题就没法根据他的左右子树求解了,怎么办呢。考虑一个很扯淡的状态,设\(dp_{u,v}\)表示考虑了\(u,v\)为根的子树,他......
  • 牛客练习赛130-A题题解
    牛客练习赛130-A题题解题目描述如下:给定两个整数x,y,jackle希望把x变成y。他每次可以进行如下两种操作之一:选择任意一个整数z,令x=x&z。选择任意一个整数z,令x=x|z。请问最少操作几次可以把x变成y。输入描述:本题有多组测试数据。第一行输入1个正整数T(1≤T......
  • [ABC134F] Permutation Oddness 题解
    T5[ABC134F]PermutationOddness很无敌的一道题。(好像是我第一次用无敌这个词把\(p_i\)和\(i\)的对应关系转化为球和盒子的配对问题,则原式中的绝对值顺利成章地就变成类似距离的一个东西。那么设\(f_{i,j,k}\)表示前\(i\)个球和盒子(注意球和盒子是一起考虑的,所以\(i......
  • [ARC185D] Random Walk on Tree 题解
    一个很套路的做法。思路题目要求走完整个树的时间,这并不好算,容易想到min-max容斥。依据min-max容斥,我们可以轻松把它转化成第一次走到所有子集的时间。考虑在这道题中,有什么特殊的。第一,任何包含根节点的子集答案都是零。第二,由于我们只关心第一次走到的点的时间,因此假......
  • ZZJC新生训练赛第五场题解
    A题思路题目要求构造一个相邻两项互质的长度为n的序列。可以直接选择输出从1到n的自然数序列,因为相邻的自然数总是互质的。题目有多个测试用例,因此需要逐个处理输入,并输出对应结果。代码#include<bits/stdc++.h>usingnamespacestd;intmain(){ios::sync_wit......
  • 题解:[YNOI2019] 游戏
    ProblemLink[YNOI2019]游戏题外话第一眼,由乃?不打不打。第二眼,欸noi三个字母怎么是大写(才发现是云南省选)。题意题意简洁,不再赘述。Solution一眼看出概率dp,但如何似乎没思路?开始公式做题:设置状态+推转移式。\(Q1\):怎么设置状态?首先,思考一个问题:第\(k\)个人该怎么“......
  • 异常问题解决
    异常:java程序编译或运行过程中出现的问题Throwable:Error:表示非常严重的问题,自己无法解决的问题Exception:除了RuntimeException其它异常【编译时期异常】:一般指的是异常尚未处理就编译了RuntimeException【运行时期异......