LeetCode 837. New 21 Game

原题:https://leetcode.com/problems/new-21-game/

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: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.

下面是解题思路:

    这是一道动态规划题目+概率题。转移方程一直没有写对导致我题目一直没做对,果然还是要多加练习。

    我们先找一找递推关系:

        1. 当i  <= W时, dp[i] = \frac{1}{W}\sum_{max(1, i-w)}^{min(k-1, i-1)}dp[i] + \frac{1}{W}, 注意累加的概率是从max(1,i-w)累加min(k-1, i-1)。因为当抽到k的时候,就不能再继续抽数字了。 而且小于i-w部分的概率是加不到的。

        2. 当i > W时, 已经不能直接抽到i了,所以概率dp[i] = \frac{1}{W}\sum_{max(1, i-w)}^{min(k-1, i-1)}dp[i]

 

最后利用条件概率求得结果:

P( i \leq N | i \geq K ) = \frac{P( K \leq i \leq N)}{ P(i \geq K)}\qquad note: i < W+K

由于有一个求和的部分,我们不妨动态的记录和的值, 代码如下:


class Solution {
public:
    double new21Game(int N, int K, int W) {
        if (K == 0 || N >= (K + W)) return 1.0;
        double dp[K+W];
        double res = 0.0;
        double dv = 0.0;
        double sum = 0.0;
        dp[0] = 0.0;
        for( int i = 1; i < K+W; ++i){
            if( i <= W ){
                dp[i] = sum/W + 1.0/W;
            }else{
                dp[i] = sum/W;
                sum -= dp[i-W];
            }
            
            if( i < K ){
                sum += dp[i];
            }else{
                dv += dp[i];
                if( i <= N ) res += dp[i];
            }
        }
        return res/dv;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值