📅  最后修改于: 2023-12-03 15:42:22.481000             🧑  作者: Mango
有 $n$ 个门,每个门都可以用一把钥匙打开,也可以破坏之后进入,在门内取得目标。在破坏门后,只需要在原本门的位置等待一段时间即可进入。每个门可以用钥匙打开的概率为 $p$,破坏它后进入的概率为 $1-p$。每个门内的目标成功取得的概率为 $q_i$。求在任意一次进入新的房间之前,取得目标的最大期望值。
第一行一个正整数 $n$,表示门的数量。
第二行 $n$ 个实数 $p_i$,表示用钥匙打开门 $i$ 的概率。
第三行 $n$ 个实数 $q_i$,表示进入门 $i$ 后取得目标的概率。
输出一个实数,表示在任意一次进入新的房间之前,取得目标的最大期望值,精确到小数点后 $6$ 位。
3
0.1 0.2 0.3
0.5 0.6 0.7
0.633333
本题可以使用动态规划求解。
设 $f_i$ 表示第 $i$ 次进入新的房间之前取得目标的最大期望值。
从 $i-1$ 到 $i$ 这个阶段,有两种决策:打开门或破坏门。
如果打开门,则有 $\sum_{j=1}^n p_j \cdot q_j$ 的期望值。
如果破坏门,则有 $\max_j {f_{i-1} + (1-p_j) \cdot q_j}$ 的期望值,其中 $j$ 是所有可以进入的门的编号。
则有状态转移方程:
$$f_i=\max{\sum_{j=1}^n p_j \cdot q_j, \max_j {f_{i-1} + (1-p_j) \cdot q_j}}$$
其中 $j$ 是所有可以进入的门的编号。
最终答案为 $f_n$。
def max_expectation(n, p, q):
f = [0] * (n + 1) # f[i]: max expectation before entering the i-th new room
for i in range(1, n+1):
expectation = sum([p[j-1]*q[j-1] for j in range(1, n+1)])
max_prev_expectation = max([f[j-1]+(1-p[j-1])*q[j-1] for j in range(1, n+1)])
f[i] = max(expectation, max_prev_expectation)
return round(f[n], 6)
注:
p
和 q
用列表表示,下标从 $0$ 开始,与题目保持一致。