File tree Expand file tree Collapse file tree 1 file changed +71
-0
lines changed Expand file tree Collapse file tree 1 file changed +71
-0
lines changed Original file line number Diff line number Diff line change @@ -2353,4 +2353,75 @@ class Solution:
2353
2353
res = sum (cur)
2354
2354
2355
2355
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
2356
2427
```
You can’t perform that action at this time.
0 commit comments