New 21 Game

medium math dp sliding window probability

Problem

Alice starts with 0 points and draws integers uniformly from [1, maxPts]. She keeps drawing while her total is strictly less than k. Return the probability her final total is ≤ n.

Inputn = 10, k = 1, maxPts = 10
Output1.00000
Alice draws once; every outcome 1..10 ≤ 10.

def new21Game(n, k, maxPts):
    if k == 0 or n >= k + maxPts:
        return 1.0
    dp = [0.0] * (n + 1)
    dp[0] = 1.0
    window = 1.0
    ans = 0.0
    for i in range(1, n + 1):
        dp[i] = window / maxPts
        if i < k:
            window += dp[i]
        else:
            ans += dp[i]
        if i - maxPts >= 0 and i - maxPts < k:
            window -= dp[i - maxPts]
    return ans
function new21Game(n, k, maxPts) {
  if (k === 0 || n >= k + maxPts) return 1.0;
  const dp = new Array(n + 1).fill(0);
  dp[0] = 1.0;
  let window = 1.0, ans = 0.0;
  for (let i = 1; i <= n; i++) {
    dp[i] = window / maxPts;
    if (i < k) window += dp[i];
    else ans += dp[i];
    if (i - maxPts >= 0 && i - maxPts < k) window -= dp[i - maxPts];
  }
  return ans;
}
class Solution {
    public double new21Game(int n, int k, int maxPts) {
        if (k == 0 || n >= k + maxPts) return 1.0;
        double[] dp = new double[n + 1];
        dp[0] = 1.0;
        double window = 1.0, ans = 0.0;
        for (int i = 1; i <= n; i++) {
            dp[i] = window / maxPts;
            if (i < k) window += dp[i];
            else ans += dp[i];
            if (i - maxPts >= 0 && i - maxPts < k) window -= dp[i - maxPts];
        }
        return ans;
    }
}
double new21Game(int n, int k, int maxPts) {
    if (k == 0 || n >= k + maxPts) return 1.0;
    vector<double> dp(n + 1, 0.0);
    dp[0] = 1.0;
    double window = 1.0, ans = 0.0;
    for (int i = 1; i <= n; i++) {
        dp[i] = window / maxPts;
        if (i < k) window += dp[i];
        else ans += dp[i];
        if (i - maxPts >= 0 && i - maxPts < k) window -= dp[i - maxPts];
    }
    return ans;
}
Time: O(n) Space: O(n)