Skip to content

Commit 8651bdb

Browse files
committed
add 03
1 parent 161a9ad commit 8651bdb

File tree

1 file changed

+50
-0
lines changed
  • leetcode刷题/note/6月刷题

1 file changed

+50
-0
lines changed

leetcode刷题/note/6月刷题/03.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
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

Comments
 (0)