LeetCode: New 21 Game Posted on May 20, 2018July 26, 2020 by braindenny New 21 Game Similar Problems: Climbing Stairs CheatSheet: Leetcode For Code Interview CheatSheet: Common Code Problems & Follow-ups Tag: #dynamicprogramming, #inspiring, #game, #possibilities 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: 0 <= K <= N <= 10000 1 <= W <= 10000 Answers will be accepted as correct if they are within 10^-5 of the correct answer. 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. // 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 } Post Views: 7