章节概述

概率类题目通常涉及期望、数学推导或动态规划求解概率值。
核心数学工具是期望的线性性和条件概率。

核心原理

1. 期望的线性性

不需要 X 和 Y 独立。这意味着可以将复杂期望分解为各组成部分期望之和。

2. 期望 DP 的两种推进方向

方向描述示例
正向递推从初始状态推到终态OSU! 递推 e1, e2
逆向递推从终态反推到初始状态搞笑世界杯 dp[i][j]

3. 关键数学公式

  • 连续成功得分的递推:
  • 相邻题做对概率:
  • 条件转移:

关键数据结构


P1297 [国家集训队] 单选错位

题目: n 道单选题串行填涂,求做对题目的期望数量。

#include <cstdio>
#include <algorithm>
using namespace std;
int a[10000005];
 
int main() {
    int n, A, B, C;
    scanf("%d%d%d%d%d", &n, &A, &B, &C, a + 1);
    for (int i = 2; i <= n; i++)
        a[i] = ((long long)a[i - 1] * A + B) % 100000001;
    for (int i = 1; i <= n; i++)
        a[i] = a[i] % C + 1;
    double ans = 0;
    for (int i = 1; i < n; i++)
        ans += min(a[i], a[i + 1]) / (double)(a[i] * a[i + 1]);
    ans += min(a[n], a[1]) / (double)(a[n] * a[1]);
    printf("%.3f\n", ans);
    return 0;
}

P1654 OSU!

题目: n 次操作,第 i 次成功概率 p_i。连续 x 次成功得 x^3 分,失败重置。求期望总得分。

思路: 利用 ,维护一次期望 e1 和二次期望 e2。

#include <cstdio>
using namespace std;
 
int main() {
    int n;
    scanf("%d", &n);
    double ans = 0, e1 = 0, e2 = 0;
    for (int i = 0; i < n; i++) {
        double p;
        scanf("%lf", &p);
        ans += p * (3 * e2 + 3 * e1 + 1);
        e2 = p * (e2 + 2 * e1 + 1);
        e1 = p * (e1 + 1);
    }
    printf("%.1f\n", ans);
    return 0;
}

P2719 搞笑世界杯

题目: 2n 张票(n 张 A, n 张 B),卖到只剩一种球迷时”搞笑”。求期望售出票数。
dp[i][j] = 还剩 i 张 A 和 j 张 B 时的期望。

#include <cstdio>
using namespace std;
double dp[1255][1255];
 
int main() {
    int n;
    scanf("%d", &n);
    n /= 2;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            dp[i][j] = i / (double)(i + j) * (dp[i - 1][j] + 1)
                     + j / (double)(i + j) * (dp[i][j - 1] + 1);
    printf("%.4f\n", dp[n][n]);
    return 0;
}

推荐练习题(洛谷)


相关技巧


多平台练习

| 洛谷 | 本题单 | 竞赛基础 |
| POJ (北大) | PKU JudgeOnline | 经典题目,适合巩固 |
| HDU (杭电) | HDU OJ | 暑期多校训练 |
| Codeforces | Codeforces | 国际竞赛,适合提升 |