|
| 1 | +# No.837 新 21 点 |
| 2 | + |
| 3 | +爱丽丝参与一个大致基于纸牌游戏 "21 点" 规则的游戏,描述如下: |
| 4 | + |
| 5 | +爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字。 抽取时,她从 [1, W] 的范围中随机获得一个整数作为分数进行累计,其中 W 是整数。 每次抽取都是独立的,其结果具有相同的概率。 |
| 6 | + |
| 7 | +当爱丽丝获得不少于 K 分时,她就停止抽取数字。 爱丽丝的分数不超过 N 的概率是多少? |
| 8 | + |
| 9 | +## 示例 |
| 10 | + |
| 11 | +``` |
| 12 | +输入:N = 10, K = 1, W = 10 |
| 13 | +输出:1.00000 |
| 14 | +说明:爱丽丝得到一张卡,然后停止。 |
| 15 | +----- |
| 16 | +输入:N = 6, K = 1, W = 10 |
| 17 | +输出:0.60000 |
| 18 | +说明:爱丽丝得到一张卡,然后停止。 |
| 19 | +在 W = 10 的 6 种可能下,她的得分不超过 N = 6 分。 |
| 20 | +----- |
| 21 | +输入:N = 21, K = 17, W = 10 |
| 22 | +输出:0.73278 |
| 23 | +``` |
| 24 | + |
| 25 | +## 解题思路 |
| 26 | + |
| 27 | +动态规划,和爬楼梯一个思路 |
| 28 | + |
| 29 | +```javascript |
| 30 | +var new21Game = function (N, K, W) { |
| 31 | + let dp = new Array(N + 1).fill(0) |
| 32 | + dp[0] = 1 |
| 33 | + let windowSum = 0 |
| 34 | + for (let i = 1; i < N + 1; i++) { |
| 35 | + if (i - W - 1 >= 0) { // 甩掉的dp[i - W - 1]要存在呀 |
| 36 | + windowSum -= dp[i - W - 1] // 甩掉上一次window左端 |
| 37 | + } |
| 38 | + if (i - 1 < K) { // 新纳入的dp[i - 1]要存在呀,分数i<=K,i-1<K |
| 39 | + windowSum += dp[i - 1]// 纳入上一次window的右侧一项 |
| 40 | + } |
| 41 | + dp[i] = windowSum * (1 / W) |
| 42 | + } |
| 43 | + let res = 0 |
| 44 | + for (let i = K; i <= N; i++) { |
| 45 | + res += dp[i] |
| 46 | + } |
| 47 | + return res |
| 48 | +}; |
| 49 | + |
| 50 | +``` |
0 commit comments