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.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/new-21-game
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
看了别人的思路,链接如下(讲的真好)https://leetcode-cn.com/problems/new-21-game/solution/di-tui-gong-shi-yi-ji-xiang-xi-jie-ti-si-lu-by-wan/
我的代码
class Solution {
public double new21Game(int N, int K, int W) {
if(K==0) {
return 1.0;
}
double []dp=new double[N+1];
double []sum=new double[N+1];
dp[0]=1;
for(int i=1;i<N+1;i++) {
double pro=0;
int left=Math.max(0,i-W);
int right=Math.min(K-1, i-1);
/*for(int j=left;j<=right;j++) {//注意当i<K时,此时仅仅只是该数出现的概率,因为>=k&&<=N(i),是不可能实现的
pro+=dp[j]*1.0/W;
}*///超时
pro=(sum[right]-sum[left]+dp[left])/W;
dp[i]=pro;
sum[i]=sum[i-1]+dp[i];
}
/*double sum=0;
for(int i=K;i<=N;i++)
sum+=dp[i];*///超时
return sum[N]-sum[K]+dp[K];
}
}
贴一个最优的
class Solution {
public double new21Game(int N, int K, int W) {
if (K==0 || N>=K+W) return 1;
double dp[] = new double[N+1], Wsum=1, res=0;
dp[0]=1;
for (int i=1; i<=N; i++) {
dp[i] = Wsum/W;
if (i<K) Wsum += dp[i];
else res += dp[i];
if (i-W >= 0) Wsum -= dp[i-W];
}
return res;
}
}