Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 141c728

Browse files
committed
🐱(weekly): 5224. 掷骰子模拟
1 parent de72f59 commit 141c728

File tree

1 file changed

+71
-0
lines changed

1 file changed

+71
-0
lines changed

docs/weekly/README.md

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2353,4 +2353,75 @@ class Solution:
23532353
res = sum(cur)
23542354

23552355
return res % (10**9 + 7)
2356+
```
2357+
2358+
----
2359+
2360+
## 第 158 场周赛
2361+
2362+
[点击前往第 158 场周赛](https://leetcode-cn.com/contest/weekly-contest-158)
2363+
2364+
### 5224. 掷骰子模拟
2365+
2366+
[原题链接](https://leetcode-cn.com/contest/weekly-contest-158/problems/dice-roll-simulation/)
2367+
2368+
`dp[i][j][k]` 表示第 `i` 轮掷骰子掷出数字 `j``j` 连续出现 `k` 次的组合数量。
2369+
2370+
那么有状态转移如下:
2371+
2372+
**`j` 并非在连续出现时(即 `k == 1` 时):**
2373+
2374+
```
2375+
// j 出现 1 次的组合数等于上一轮投出非数字 j 的所有情况和
2376+
dp[i][j][1] = sum(dp[i - 1][other != j][:])
2377+
```
2378+
2379+
**`j` 连续出现 `k(k > 1)` 次时:**
2380+
2381+
```
2382+
if k <= rollMax[j]:
2383+
// 本轮投出连续出现 k 次数字 j 的情况数量等于:上一轮连续投掷出 k - 1 次 j 的情况数量
2384+
dp[i][j][k] = dp[i - 1][j][k - 1]
2385+
```
2386+
2387+
ps:很多同学说测试用例是错的,可能是因为理解错题意了,题目说的是 **连续** 掷出数字 `i` 的次数不能超过 `rollMax[i]`,而不是数字的投掷总数。
2388+
2389+
具体实现:
2390+
2391+
```python
2392+
class Solution:
2393+
def dieSimulator(self, n: int, rollMax: List[int]) -> int:
2394+
dp = [[[0 for _ in range(16)] for _ in range(7)] for _ in range(n + 1)]
2395+
mod = 10**9 + 7
2396+
2397+
for i in range(1, n + 1):
2398+
# 投掷的数
2399+
for j in range(1, 7):
2400+
# 第一次投掷
2401+
if i == 1:
2402+
dp[i][j][1] = 1
2403+
continue
2404+
2405+
# 数字 j 连续出现 k 次
2406+
for k in range(2, rollMax[j - 1] + 1):
2407+
dp[i][j][k] = dp[i - 1][j][k - 1]
2408+
2409+
# 前一次投出的数不是 j
2410+
s = 0
2411+
for l in range(1, 7):
2412+
if l == j:
2413+
continue
2414+
for k in range(1, 16):
2415+
s += dp[i - 1][l][k]
2416+
s %= mod
2417+
dp[i][j][1] = s
2418+
2419+
res = 0
2420+
for j in range(1, 7):
2421+
for k in range(1, 16):
2422+
# 求投掷 n 次时所有组合总和
2423+
res += dp[n][j][k]
2424+
res %= mod
2425+
2426+
return res
23562427
```

0 commit comments

Comments
 (0)