RandomPaintingOnABoard

作者:罗煜楚

关键词:数学 概率 期望 枚举 状态压缩 动态规划

题目简述

给出一个的棋盘,每个格子上有一个0到9的数字,所有的数字之和为S,现在玩一个游戏,一开始所有的格子都是白色的,每一回合你要按一定的概率选择一个格子,并将这个格子染黑(已经被染黑的格子可能被重复染色),如果一个格子上的数字为,那么这个格子被选择的概率是,当在某一回合之后,如果发现这个棋盘的每一行每一列都至少有一个格子是黑色的,那么游戏结束,请求出游戏结束的期望回合数。

每个格子上的数字保证在0到9之间

保证每一行每一列至少有一个格子上的数字非0

算法

首先我们注意到由于,而所以n,m中小的那一个不会超过12,我们可以将数据范围看作

如果直接计算期望的回合数,公式是这样的:

这个公式还有个i的系数,不太好算,于是我们可以将计算期望的公式变一下。
由于

所以可以推出

所以我们就只需要算出经过i回合之后游戏没有结束的概率了,这就很好解决了。由于游戏没有结束,那么一定是有一些行或列之中一个格子都没有被选中,这就是一个简单的容斥原理的应用

我们先将每一行每一列不被选中的概率加起来,即,然后发现对于有两个行/列的情况,我们计算了两次,所以要减去,而有三个行/列的情况,在算一个的时候算了3次,算两个时减去3次,所以又少算了,有要加上...,所以最后形式如下

然后我们将这个公式于之前算期望的公式结合起来得到:

对于可以使用等比数列求和求出等于1+,这里不会有的情况,但是要注意的特殊情况。

此时我们又发现一个问题,在枚举不被选中行/列的集合s时,复杂度为可能非常大,但是我们注意到n的范围只有12,是非常小的,而且格子上的数字都是0~9的小数字,格子上的数字和也不大,于是我们就可以用Dp来解决。

首先由于n很小,所以我们可以枚举s集合中的行是那一些,我们把这些行的概率求和,然后对于每一列,我们算出如果选择这一列,概率和还会增加多少,我们用记录在第i列但不在选择的行中的格子上的数字和是多少,我们按列Dp,Dp状态表示当前考虑了前i列,当前的选择了的列的之和是多少,0/1表示选择了的列的集合大小为奇数还是偶数,d的不同集合的个数。

转移方程:

求出了概率为一特定值的集合的个数,我们就可以直接带入之前的公式计算即可,于是我们就在的时间里解决了这道题。

results matching ""

    No results matching ""