File tree Expand file tree Collapse file tree 1 file changed +50
-0
lines changed Expand file tree Collapse file tree 1 file changed +50
-0
lines changed Original file line number Diff line number Diff line change
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
+ ```
You can’t perform that action at this time.
0 commit comments