题目描述:

方法:动态规划O(6∗6∗n∗15)

递归:

from functools import lru_cache
class Solution:
def dieSimulator(self, n, rollMax):
MOD = 10 ** 9 + 7
@lru_cache(None)
def dp(i, j, k):
# i rolls, recently rolled j, k times
if i == 0:
return 1
ans = 0
for d in range(6):
if d != j:
ans += dp(i-1, d, 1)
elif k + 1 <= rollMax[d]:
ans += dp(i-1, d, k+1)
ans %= MOD
return ans
return dp(n, -1, 0) % MOD

迭代:

class Solution(object):
def dieSimulator(self, n, rollMax):
M = 10**9+7
data = [[1]+[0]*(rollMax[i]-1) for i in range(6)]
for _ in range(n-1):
sums = [sum(x) for x in data]
s = sum(sums)
for j in range(6):
n = rollMax[j]
for k in range(n-1,0,-1):
data[j][k] = data[j][k-1]
data[j][0] = (s - sums[j]) % M
#print (data)
return sum([sum(x) for x in data]) % M

解析:

class Solution:
def dieSimulator(self, n: int, rollMax: List[int]) -> int:
dp = [[[0 for _ in range(16)] for _ in range(7)] for _ in range(n + 1)]
mod = 10**9 + 7 for i in range(1, n + 1):
# 投掷的数
for j in range(1, 7):
# 第一次投掷
if i == 1:
dp[i][j][1] = 1
continue # 数字 j 连续出现 k 次
for k in range(2, rollMax[j - 1] + 1):
dp[i][j][k] = dp[i - 1][j][k - 1] # 前一次投出的数不是 j
s = 0
for l in range(1, 7):
if l == j:
continue
for k in range(1, 16):
s += dp[i - 1][l][k]
s %= mod
dp[i][j][1] = s res = 0
for j in range(1, 7):
for k in range(1, 16):
# 求投掷 n 次时所有组合总和
res += dp[n][j][k]
res %= mod return res

leetcode-158周赛-5224-掷筛子模拟的更多相关文章

  1. LeetCode 1223. 掷骰子模拟 Dice Roll Simulation - Java - DP

    题目链接:1223. 掷骰子模拟 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[ ...

  2. LeetCode双周赛#36

    1604. 警告一小时内使用相同员工卡大于等于三次的人 题目链接 题意 给定两个字符串数组keyName和keyTime,分别表示名字为keytime[i]的人,在某一天内使用员工卡的时间(格式为24 ...

  3. Leetcode 双周赛#32 题解

    1540 K次操作转变字符串 #计数 题目链接 题意 给定两字符串\(s\)和\(t\),要求你在\(k\)次操作以内将字符串\(s\)转变为\(t\),其中第\(i\)次操作时,可选择如下操作: 选 ...

  4. Leetcode 220 周赛 题解

    5629. 重新格式化电话号码 模拟 注意一些细节,最后位置是否取值. class Solution { public: string reformatNumber(string number) { ...

  5. Leetcode】周赛203 查找大小为M的最新分组

    题意: 给你一个数组 arr ,该数组表示一个从 1 到 n 的数字排列.有一个长度为 n 的二进制字符串,该字符串上的所有位最初都设置为 0 . 在从 1 到 n 的每个步骤 i 中(假设二进制字符 ...

  6. ✡ leetcode 158. Read N Characters Given Read4 II - Call multiple times 对一个文件多次调用read(157题的延伸题) --------- java

    The API: int read4(char *buf) reads 4 characters at a time from a file. The return value is the actu ...

  7. leetcode[158] Read N Characters Given Read4 II - Call multiple times

    想了好一会才看懂题目意思,应该是: 这里指的可以调用更多次,是指对一个文件多次操作,也就是对于一个case进行多次的readn操作.上一题是只进行一次reandn,所以每次返回的是文件的长度或者是n, ...

  8. LeetCode 12 - 整数转罗马数字 - [简单模拟]

    题目链接:https://leetcode-cn.com/problems/integer-to-roman/ 题解: 把 $1,4,5,9,10,40,50, \cdots, 900, 1000$ ...

  9. [leetcode]158. Read N Characters Given Read4 II - Call multiple times 用Read4读取N个字符2 - 调用多次

    The API: int read4(char *buf) reads 4 characters at a time from a file. The return value is the actu ...

随机推荐

  1. zabbix快速安装(Ubuntu18.04, Nginx)

    ubuntu18.04快速安装zabbix4.0 https://blog.csdn.net/qq_33317586/article/details/83867756 需要安装的东西:nginx,ph ...

  2. MATLAB中图像处理的函数

    表1 图像显示 函数名 功能说明 函数名 功能说明 colorbar 颜色条显示 montage 按矩形剪辑方式显示多帧图像 getimage 从坐标系中获取图像数据 immovie 从多帧索引图像中 ...

  3. Codeforces 348E 树的中心点的性质 / 树形DP / 点分治

    题意及思路:http://ydc.blog.uoj.ac/blog/12 在求出树的直径的中心后,以它为根,对于除根以外的所有子树,求出子树中的最大深度,以及多个点的最大深度的lca,因为每个点的最长 ...

  4. git常用操作命令归纳

    git开始 全局配置:配置用户名和e-mail地址 $ git config --global user.name"Your Name" $ git config --global ...

  5. leetcode-161周赛-5248-统计【优美子数组】

    题目描述: 自己的提交:超时: class Solution: def numberOfSubarrays(self, nums, k: int) -> int: dp = [0]* (len( ...

  6. Python 项目隔离环境virtualenv--venv

    virtualenv 用来为一个应用创建一套“隔离”的python运行环境. 先安装virtualenv: pip3 install virtualenv 再进入项目目录,或者创建一个项目目录并进入, ...

  7. sql 基本查询

    要查询数据库表的数据,我们使用如下的SQL语句: SELECT * FROM <表名> 假设表名是students,要查询students表的所有行,我们用如下SQL语句: -- 查询st ...

  8. PHP ftp_nb_get() 函数

    定义和用法 ftp_nb_get() 函数从 FTP 服务器上下载一个文件并保存到本地一个文件中.(无阻塞) 该函数返回下列值之一: FTP_FAILED(发送/获取失败) FTP_FINISHED( ...

  9. 【LeetCode 13】罗马数字转整数

    题目链接 [题解] 就是上一题反过来的过程. 因为有说一般情况下后面的罗马数字是小于前面的罗马数字的. 如果前面的罗马数字小于后面的罗马数字了. 说明出现了4,9,40,90这些特殊情况. 那么就得判 ...

  10. (转)Linux下使用system()函数一定要谨慎

    转:http://my.oschina.net/renhc/blog/53580 曾经的曾经,被system()函数折磨过,之所以这样,是因为对system()函数了解不够深入.只是简单的知道用这个函 ...