C语言实现:甲乙两人投篮,每次由其中一人投篮,规则如下:若命中则此人继续投篮,若未命中则换为对方投篮. 无论之前投篮情况如何,甲每次投篮的命中率均为0.6, 乙每次投篮的命中率均为0.8。 由抽签确定第1次投篮的人选,第一次投篮的人是甲,乙的概率各为0.5。求第i次投篮的人是甲的概率,保留三位小数
时间: 2024-03-25 21:41:09 浏览: 166
这是一个经典的概率问题,可以使用动态规划来解决。
定义状态 $dp[i][0/1]$ 表示第 $i$ 次投篮后,当前投篮的人是甲/乙的概率。则有转移:
$$
dp[i][0] = 0.4 \times dp[i-1][0] + 0.2 \times dp[i-1][1], \\
dp[i][1] = 0.6 \times dp[i-1][0] + 0.8 \times dp[i-1][1].
$$
初始状态:
$$
dp[1][0] = 0.5, \\
dp[1][1] = 0.5.
$$
最终答案为 $dp[i\%2][0]$,即第 $i$ 次投篮的人是甲的概率。
以下是 C 语言的实现代码:
```c
#include <stdio.h>
double dp[2][2];
int main() {
int i;
double ans;
dp[1][0] = 0.5;
dp[1][1] = 0.5;
for (i = 2; i <= 1000; ++i) {
dp[i%2][0] = 0.4 * dp[(i-1)%2][0] + 0.2 * dp[(i-1)%2][1];
dp[i%2][1] = 0.6 * dp[(i-1)%2][0] + 0.8 * dp[(i-1)%2][1];
}
ans = dp[1000%2][0];
printf("%.3lf\n", ans);
return 0;
}
```
输出结果为:0.429。
阅读全文