Leetcode: New 21 Game

New 21 Game



Similar Problems:


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, W], where W is an integer. Each draw is independent and the outcomes have equal probabilities.

Alice stops drawing numbers when she gets K or more points. What is the probability that she has N or less points?

Example 1:

Input: N = 10, K = 1, W = 10
Output: 1.00000
Explanation:  Alice gets a single card, then stops.

Example 2:

Input: N = 6, K = 1, W = 10
Output: 0.60000
Explanation:  Alice gets a single card, then stops.
In 6 out of W = 10 possibilities, she is at or below N = 6 points.

Example 3:

Input: N = 21, K = 17, W = 10
Output: 0.73278

Note:

  1. 0 <= K <= N <= 10000
  2. 1 <= W <= 10000
  3. Answers will be accepted as correct if they are within 10^-5 of the correct answer.
  4. The judging time limit has been reduced for this question.

Github: code.dennyzhang.com

Credits To: leetcode.com

Leave me comments, if you have better ways to solve.


// Blog link: https://code.dennyzhang.com/new-21-game
// Basic Ideas: dynamic programming
// dp(i): The possibility of get i
//
//      O ... O + b
//                b in [1, W]
//
// dp[i] = (dp[i-1]+dp[i-2]+dp[i-3]+... + dp[i-W])/W
//
// result:
//         dp[K]+dp[K+1]+...dp[N]
//
// Complexity: Time O(N), Space O(N)
func new21Game(N int, K int, W int) float64 {
    if (K == 0 || N >= K + W) { return 1.0 }
    dp := make([]float64, N+1)
    dp[0] = 1
    var sum, res float64
    sum, res = 1, 0
    for i:=1; i<=N; i++ {
        dp[i] = sum/float64(W)
        if i<K {
            sum += dp[i]
        } else {
            res += dp[i] 
        }
        if i-W>=0 {
            sum -= dp[i-W]
        }
    }
    return res
}
linkedin
github
slack

Share It, If You Like It.

Leave a Reply

Your email address will not be published.