原题: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:
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.
下面是解题思路:
这是一道动态规划题目+概率题。转移方程一直没有写对导致我题目一直没做对,果然还是要多加练习。
我们先找一找递推关系:
1. 当i <= W时, , 注意累加的概率是从max(1,i-w)累加min(k-1, i-1)。因为当抽到k的时候,就不能再继续抽数字了。 而且小于i-w部分的概率是加不到的。
2. 当i > W时, 已经不能直接抽到i了,所以概率。
最后利用条件概率求得结果:
由于有一个求和的部分,我们不妨动态的记录和的值, 代码如下:
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;
}
};