leetcode-158周赛-5224-掷筛子模拟
题目描述:
方法:动态规划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-掷筛子模拟的更多相关文章
- LeetCode 1223. 掷骰子模拟 Dice Roll Simulation - Java - DP
题目链接:1223. 掷骰子模拟 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[ ...
- LeetCode双周赛#36
1604. 警告一小时内使用相同员工卡大于等于三次的人 题目链接 题意 给定两个字符串数组keyName和keyTime,分别表示名字为keytime[i]的人,在某一天内使用员工卡的时间(格式为24 ...
- Leetcode 双周赛#32 题解
1540 K次操作转变字符串 #计数 题目链接 题意 给定两字符串\(s\)和\(t\),要求你在\(k\)次操作以内将字符串\(s\)转变为\(t\),其中第\(i\)次操作时,可选择如下操作: 选 ...
- Leetcode 220 周赛 题解
5629. 重新格式化电话号码 模拟 注意一些细节,最后位置是否取值. class Solution { public: string reformatNumber(string number) { ...
- Leetcode】周赛203 查找大小为M的最新分组
题意: 给你一个数组 arr ,该数组表示一个从 1 到 n 的数字排列.有一个长度为 n 的二进制字符串,该字符串上的所有位最初都设置为 0 . 在从 1 到 n 的每个步骤 i 中(假设二进制字符 ...
- ✡ 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 ...
- leetcode[158] Read N Characters Given Read4 II - Call multiple times
想了好一会才看懂题目意思,应该是: 这里指的可以调用更多次,是指对一个文件多次操作,也就是对于一个case进行多次的readn操作.上一题是只进行一次reandn,所以每次返回的是文件的长度或者是n, ...
- LeetCode 12 - 整数转罗马数字 - [简单模拟]
题目链接:https://leetcode-cn.com/problems/integer-to-roman/ 题解: 把 $1,4,5,9,10,40,50, \cdots, 900, 1000$ ...
- [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 ...
随机推荐
- vue+vue-cli2+webpack配置资源cdn
vue-cli2+webpack构建的vue项目如何让图片和js等静态资源走cdn,哪里可以配置呢?下面我详细介绍 1.config/index.js中可以看到 module.exports = { ...
- tengine日志切割-配置分钟级别日志自动切割
tengine日志切割-配置分钟级别日志自动切割 安装 以安装最新版本的tengine-2.1.2版本 下载连接 tengine支持许多变量 变量 $conn_requests 当前请求在长连接上的序 ...
- Java数据库事务四大特性以及隔离级别
四大特性ACID 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚.失败回滚的操作事务,将不能对数据库有任何影响 一致性(Consistency) 一致性是指事 ...
- SpringBoot 2.x 使用 JWT(JSON Web Token)
一.跨域认证遇到的问题 由于多终端的出现,很多的站点通过 web api restful 的形式对外提供服务,采用了前后端分离模式进行开发,因而在身份验证的方式上可能与传统的基于 cookie 的 S ...
- sql update语句
如果要更新数据库表中的记录,我们就必须使用UPDATE语句. UPDATE语句的基本语法是: UPDATE <表名> SET 字段1=值1, 字段2=值2, ... WHERE ...; ...
- HZOI2019SF
Simulation Final 坑.下午我要爆零(RP++) upd: 哈哈哈哈哈哈哈哈哈哈我真的爆零了哈哈哈哈哈哈哈哈哈哈 关于细节, T1A了但是和T3交反了哈哈哈哈哈哈哈哈哈哈 我说我真的不是 ...
- 线段树双tag+差分数组——cf1208E
写了一上午 /* 对于每个数组a[],先排序然后从大到小把a[i]放进线段树更新 设a[i]的位置是pos,那么其可更新的区间是[pos,w-(li-pos)] 线段树结点保存 tag=now表示当前 ...
- Vue2.0源码思维导图-------------Vue 初始化
上一节看完<Vue源码思维导图-------------Vue 构造函数.原型.静态属性和方法>,这节将会以new Vue()为入口,大体看下 this._init()要做的事情. fun ...
- 原生Ajax( XHR 和 Fetch )
原生Ajax 基本使用的四大步骤,简单易懂 ajax(异步javascript xml) 能够刷新局部网页数据而不是重新加载整个网页.接下来通过本文给大家介绍Ajax的使用四大步骤,非常不错,感兴趣的 ...
- NAT和路由器 基本概念
NAT(Network Address Translation, 网络地址转换)是1994年提出的.当在专用网内部的一些主机本来已经分配到了本地IP地址(即 仅在本专用网内使用的专用地址),但现在又想 ...