All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0801_0900.s0837_new_21_game.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g0801_0900.s0837_new_21_game;

// #Medium #Dynamic_Programming #Math #Sliding_Window #Probability_and_Statistics
// #2022_03_24_Time_5_ms_(77.70%)_Space_43.8_MB_(59.58%)

/**
 * 837 - New 21 Game\.
 *
 * Medium
 *
 * Alice plays the following game, loosely based on the card game **"21"**.
 *
 * Alice starts with `0` points and draws numbers while she has less than `k` points. During each draw, she gains an integer number of points randomly from the range `[1, maxPts]`, where `maxPts` is an integer. Each draw is independent and the outcomes have equal probabilities.
 *
 * Alice stops drawing numbers when she gets `k` **or more points**.
 *
 * Return the probability that Alice has `n` or fewer points.
 *
 * Answers within 10-5 of the actual answer are considered accepted.
 *
 * **Example 1:**
 *
 * **Input:** n = 10, k = 1, maxPts = 10
 *
 * **Output:** 1.00000
 *
 * **Explanation:** Alice gets a single card, then stops.
 *
 * **Example 2:**
 *
 * **Input:** n = 6, k = 1, maxPts = 10
 *
 * **Output:** 0.60000
 *
 * **Explanation:** Alice gets a single card, then stops. In 6 out of 10 possibilities, she is at or below 6 points.
 *
 * **Example 3:**
 *
 * **Input:** n = 21, k = 17, maxPts = 10
 *
 * **Output:** 0.73278
 *
 * **Constraints:**
 *
 * *   0 <= k <= n <= 104
 * *   1 <= maxPts <= 104
**/
public class Solution {
    public double new21Game(int n, int k, int w) {
        if (n >= k + w || k == 0) {
            return 1.0;
        }
        double[] dp = new double[n + 1];
        dp[0] = 1.0;
        double res = 0.0;
        double runningSum = dp[0];
        for (int i = 1; i <= n; i++) {
            dp[i] = runningSum / w;
            if (i < k) {
                runningSum += dp[i];
            } else {
                res += dp[i];
            }
            if (i - w >= 0) {
                runningSum -= dp[i - w];
            }
        }
        return res;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy