📜  门|门CS 2010 |问题 1(1)

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

门|门CS 2010 |问题 1

题目描述

有 $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)

注:

  • 代码中的列表下标从 $0$ 开始,与题目中的下标从 $1$ 开始不同,需要注意。
  • 函数的输入参数 pq 用列表表示,下标从 $0$ 开始,与题目保持一致。