题目一:

你不断掷一个骰子,把点数累加,不限制次数,总分超过m就停止,求总分落在[m,n]区间的概率。

class Solution {
public:
    double get_res(int n, int m) {
        if (m == 0) {
            return 1.0;
        }
        vector<double> dp(m + 6);
        for (int i = m; i <= n && i < m + 6; i++) {
            dp[i] = 1.0;
        }
        for (int i = m - 1; i >= 0; i--) {
            for (int j = 1; j <= 6; j++) {
                dp[i] += dp[i + j] / 6;
            }
        }
        return dp[0];
    }
};

题目二:

使用一个均匀的六面骰子,不断投掷,直到连续两次掷出6,求期望投掷次数。

E0 = 42

我们只需要关心“当前连续背面个数”:

  • 状态 S0:一次没扔
  • 状态 S1:扔了一次6,还差一次
  • 状态 S2终止状态

转移关系:

  • 从 S0:
    • 1/6:扔到6,进入S1
    • 5/6:未扔到,仍然是S0
  • 从 S1:
    • 5/6:回到 S0
    • 1/6:进入 S2(游戏结束)
  • S2:吸收态(游戏结束)

设:

  • E0 = 从 S0 到 S2 的期望步数
  • E1 = 从 S1 到 S2 的期望步数

列方程:

E0 = 1 + E1/6 + 5E0/6
E1 = 1 + 5E0/6   (因为从S1抛背面就结束了)