LeetCode 837. 新21点

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

 

思路:

当手中的牌是i时,获胜的概率是:d[i] = 1/w*(d[i+1]+....+dp[i+w])

当进行最后一次抽牌时,手中牌的最大值应该为k-1;因为》=k就不可以抽牌了。

所以最后手中最大的牌面是k+w-1;在[k,k+w-1]时,收的的牌小于等于N的概率是1,大于N的概率是0.我们 可以反推出d[k-1]的概率。因为[k,k+w-1]可以根据k-1抽牌得到。

同时我们可以根据[k-1,k-w+2]得到k-1的概率,一直前移,就可以得到最后(没有抽牌时)的结果。

 

代码:

class Solution {
public:
    double new21Game(int N, int K, int W) {
        vector<double> dp(K+W);
        double s=0;
        for(int i=K;i<K+W && i<=N;i++){
            s++;
            dp[i]=1;
        }
        for(int i=K-1;i>=0;i--){
            dp[i] = 1.0/W*s;
            s = s-dp[i+W]+dp[i];
        }
        return dp[0];
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值