力扣837java

今天做了一道力扣觉着很有意思力扣837 这个做的费点时间 想半天才想通这位大佬写的 看一看
这是我自己的一些理解 这里我改成了void 形式便于输出

package Leetcode;

public class Demo837 {
    /*这题很难理解 其实就是抓牌游戏 N=21 K=17  W=10
    * 我从0开始抓范围是0-w的牌 然后累加 然后当手上的分数不到17可以继续抓 但是只要到了17
    * 比如16抓一个1就到了17  这个时候就不能抓了  让我们求概率 :
    *                               我最后得分不超过 N的概率
    * 其实也就是16的时候抓12345都是赢678910是数 这个被抓比率相同赢得概率是1也相同
    *   但是后面比如15  这个时候你抓到1 之后你赢得概率就是刚刚算类的上面那个概率
    *                 抓到2赢得概率还是1
    *                  所以就想到了一个
*                   16赢得概率等于 (17赢得概率+18+...+26)/10
*                   15的概率等于(16的概率 +17赢得概率+...+26赢得概率)/10
*                    这样就可以用一个数组17+10其实只需要16+10 但是数组开始的地方就是要求的概率
*                   这里其实有点想不通 但是吧就是数是0赢得概率就是我们求的概率 本来我以为是所有0-17概率和想一下
*                 不对 因为16的概率会用到很多地方
* 所以dp【0】就是要求的
*
    * */
    public static void main(String[] args) {

           new21Game(21,17,10);

    }
    public static void new21Game(int N, int K, int W) {

    double[] dp=new double[K+W];
        if (N - K + 1 >= W) {
            dp[0]=1.0;//避免出现特殊案例 比如101
        }
    //给K到N都赋值为1 N到k+w-n都为0
        for (int i = K; i <=N ; i++) {
            dp[i]=1.00;
        }
        double startgailv=N-K+1;
        for (int i = K-1; i >=0 ; i--) {
            dp[i]=startgailv/W;
            startgailv=startgailv-dp[W+i]+dp[i];
        }
        System.out.println(dp[0]);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值