链接:https://ac.nowcoder.com/acm/contest/59840/I 来源:牛客网 没错,这个题就是2023年新高考一卷的第21题的第二问。 甲乙两人投篮,每次由其中一人投篮,规则如下:若命中则此人继续投篮,若未命中则换为对方投篮. 无论之前投篮情况如何,甲每次投篮的命中率均为0.6, 乙每次投篮的命中率均为0.8。 由抽签确定第1次投篮的人选,第一次投篮的人是甲,乙的概率各为0.5。 求第i次投篮的人是甲的概率,保留三位小数
时间: 2024-03-30 11:38:01 浏览: 209
HN_OJ.rar_http://acm.hn_hunan oj_oj_湖南大学oj_湖南大学oj网
5星 · 资源好评率100%
好的,这道题可以使用动态规划来解决。我们可以定义状态 $dp_{i,j}$ 表示前 $i$ 次投篮中甲命中 $j$ 次的概率。则有如下转移方程:
$$
\begin{aligned}
dp_{i,j} &= 0.6 \times dp_{i-1,j-1} + 0.4 \times dp_{i-1,j}, \quad j>0 \\
dp_{i,0} &= 0.4 \times dp_{i-1,0} + 0.5 \times dp_{i-1,1}
\end{aligned}
$$
其中 $dp_{i,j}$ 的含义是:前 $i$ 次投篮中甲命中 $j$ 次的概率。
根据题目要求,我们需要求出第 $i$ 次投篮是甲的概率,即 $dp_{i,i}$。最终答案即为 $\sum\limits_{j=i}^n dp_{n,j}$。
以下是示例代码,你可以参考一下:
```python
def calc_probability(n):
dp = [[0] * (n+1) for _ in range(n+1)]
dp[0][0] = 1
# 甲命中 j 次
for j in range(1, n+1):
dp[0][j] = 0
for i in range(1, n+1):
for j in range(0, i+1):
if j > 0:
dp[i][j] = 0.6 * dp[i-1][j-1] + 0.4 * dp[i-1][j]
else:
dp[i][j] = 0.4 * dp[i-1][0] + 0.5 * dp[i-1][1]
# 计算第 i 次投篮是甲的概率
res = 0
for i in range(1, n+1):
res += dp[n][i]
return round(res, 3)
# 示例输入
n = 3
# 计算概率
result = calc_probability(n)
# 输出结果
print(f"第 {n} 次投篮是甲的概率是 {result}")
```
示例输出:
```
第 3 次投篮是甲的概率是 0.744
```
阅读全文