链接: LeetCode 837 题目.
链接: 题目详细参考学习博客.
Tip:本文章用于留存记忆
class Solution {
public:///设最终分数为x, x 属于闭区间[k,k + w - 1]
double new21Game(int N, int K, int W) {///开始分为0, k = 0, 则一次都没有抽 分数一定不超过n
if (K == 0 || N >= K + W) return 1; ///当 n > x(max) 分数一定不超过n。
if (N < K) return 0; ///分数最终到n < x(min) 分数一定超过n。
vector<double> dp(N + 1);
double res = 0, sum = 0; /// sum递推区间和(dp[i - 1] ... dp[i - w]), res只需要累加[k, n]的概率
for (int i = 1; i <= N; ++i) {
dp[i] = i <= W ? (sum + 1.0) / W : sum / W;
if (i < K) sum += dp[i]; ///还可以继续抽分,当前抽分由前面的作为出发点
else res += dp[i]; ///不能抽分,加上满足题意区间[k, n]的概率
if (i > W) sum -= dp[i - W]; ///减去i + 1递推时的非法的来源
} ///sum 始终存分数可通过+ [1, W]递推到当前分数点的前区间和
return res;
}
};