📜  门| GATE CS 2013 |问题23(1)

📅  最后修改于: 2023-12-03 15:42:11.673000             🧑  作者: Mango

门| GATE CS 2013 |问题23

这是一道2013年的GATE计算机科学问题,涉及到概率和图论的知识。题目如下:

在一个有$n$个门的房间里,每个门都通向另一个门或者通向外面。门之间的连接关系构成了一个有向图。每个门都有可能是机关门,而且只有当门被锁上时才会是机关门。如果门是机关门,需要用相应的钥匙才能打开。在一个给定的门和钥匙的序列中,如果这个门是机关门而且有相应的钥匙,我们就称这个门是“可行门”。如果在从房间外进入这个房间的过程中没有遗漏任何钥匙,那么我们称这个序列是“良好序列”。现在假设每个门被锁上的概率是$p$,并且我们能够找到一个良好序列。我们要求在这个前提下,有多少个门是机关门的期望值。例如,如果期望值是$2.68$,则输出$2.68$。

这个问题可以用概率和图论的知识来解决。我们可以用$\lambda_i$表示从门$i$进入房间后需要的钥匙的数量。我们要求的是机关门的期望值,可以用$\sum_{i=1}^np_i$来表示。对于每个门$i$,如果我们已知$\lambda_j(j<i)$的值,则$\lambda_i$的值可以根据连通图的性质来求得。

我们可以用一个$dp$来求解这个问题,其中$dp[i]$表示到第$i$个门时剩余需要的钥匙的期望值。状态转移方程为:

$$ dp[1]=0 $$

$$ dp[i]=\begin{cases} 0, & \text{if }i= n+1\ 1+p& \text{if }i< n+1 \text{ and } i \text{是可行门}\ 1+\sum_{j\to i,j>i}\frac{dp[j]}{outdegree_j},& \text{if }i< n+1 \text{ and } i \text{不是可行门} \end{cases} $$

其中$outdegree_j$表示门$j$可以到达的门的数量。

最终的结果即为$\sum_{i=1}^np_ip_i$,即为机关门的期望值。

下面是用Python实现的代码片段:

def expect(n: int, p: float, doors: List[int], keys: List[int]) -> float:
    e = [1] * (n+1)
    vis = [False] * (n+1)

    for i in range(n):
        if doors[i] == keys[i]:
            e[i+1] = 0
            vis[i+1] = True

    for i in range(1, n+1):
        if not vis[i]:
            t = 0
            for j in range(n):
                if doors[j] == keys[i-1]:
                    t += e[j+1] / outdegree(j, doors)
            e[i] = t + 1

    ans = 0
    for i in range(1, n+1):
        ans += p * e[i]
    return ans

以上就是解决这道问题的方法和代码实现。