/**
* 837. 新21点
* @author wsq
* @date 2020/10/26
爱丽丝参与一个大致基于纸牌游戏 “21点” 规则的游戏,描述如下:
爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字。 抽取时,她从 [1, W] 的范围中随机获得一个整数作为分数进行累计,其中 W 是整数。 每次抽取都是独立的,其结果具有相同的概率。
当爱丽丝获得不少于 K 分时,她就停止抽取数字。 爱丽丝的分数不超过 N 的概率是多少?
示例 1:
输入:N = 10, K = 1, W = 10
输出:1.00000
说明:爱丽丝得到一张卡,然后停止。
示例 2:
输入:N = 6, K = 1, W = 10
输出:0.60000
说明:爱丽丝得到一张卡,然后停止。
在 W = 10 的 6 种可能下,她的得分不超过 N = 6 分。
链接:https://leetcode-cn.com/problems/new-21-game
*/
package com.wsq.dp;
public class New21Game {
/**
* 动态规划
* 按照从后向前顺序计算
* @param N
* @param K
* @param W
* @return
*/
public double new21Game(int N, int K, int W) {
if(K == 0){
return 1.0;
}
double[] f = new double[K + W];
// 初始化转移方程
for(int i = K; i <= N && i < K + W; i++){
f[i] = 1.0;
}
// 为了计算方便,采用类似滑动窗口的方式,减少计算代价
f[K-1] = 1.0 * Math.min(N - K + 1, W) / W;
for(int i = K-2; i >=0; i--){
f[i] = f[i+1] - (f[i + W + 1] - f[i + 1]) / W;
}
return f[0];
}
}
837. 新21点(动态规划)
最新推荐文章于 2024-07-12 18:02:43 发布