LeetCode837

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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值