LeetCode 1223. 掷骰子模拟(DP)
1. 题目
有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数。
不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始编号)。
现在,给你一个整数数组 rollMax 和一个整数 n,请你来计算掷 n 次骰子可得到的不同点数序列的数量。
假如两个序列中至少存在一个元素不同,就认为这两个序列是不同的。
由于答案可能很大,所以请返回 模 10^9 + 7 之后的结果。
示例 1:
输入:n = 2, rollMax = [1,1,2,2,2,3]
输出:34
解释:我们掷 2 次骰子,如果没有约束的话,共有 6 * 6 = 36 种可能的组合。
但是根据 rollMax 数组,数字 1 和 2 最多连续出现一次,
所以不会出现序列 (1,1) 和 (2,2)。因此,最终答案是 36-2 = 34。示例 2:
输入:n = 2, rollMax = [1,1,1,1,1,1]
输出:30示例 3:
输入:n = 3, rollMax = [1,1,1,2,2,3]
输出:181提示:
1 <= n <= 5000
rollMax.length == 6
1 <= rollMax[i] <= 15
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/dice-roll-simulation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
类似题目:
LeetCode 1155. 掷骰子的N种方法(DP)
剑指Offer - 面试题60. n个骰子的点数(动态规划)
- 样本维度 i
- 状态维度投出的是几点(上一次,当前次)j,nj
- 投出的点,连续了几次 k
class Solution { //C++
public:int dieSimulator(int n, vector<int>& rollMax) {vector<vector<vector<int>>> dp(n,vector<vector<int>>(6,vector<int>(16,0)));int i,j,nj,k;for(j = 0; j < 6; ++j){ //初始化dp[0][j][1] = 1;//0次投出j点,j连续了1次的方案数}for(i = 1; i < n; ++i){ //后序的样本for(j = 0; j < 6; ++j){ //前一次投出的点数for(k = 1; k <= 15; ++k){ //前一次的最后的点数连续了几次if(dp[i-1][j][k] != 0){ //状态存在for(nj = 0; nj < 6; ++nj){ //这一次投的点数if(nj == j && k+1 <= rollMax[j])//跟上一次一样的点且连续次数不超dp[i][nj][k+1] = (dp[i][nj][k+1]+dp[i-1][j][k])%1000000007;if(nj != j)//跟上一次不一样,连续次数变为1次dp[i][nj][1] = (dp[i][nj][1]+dp[i-1][j][k])%1000000007;}}}}}int sum = 0;for(j = 0; j < 6; ++j){ //求和for(k = 1; k <= 15; ++k)sum = (sum+dp[n-1][j][k])%1000000007;}return sum;}
};
288 ms 30.7 MB
class Solution:def dieSimulator(self, n: int, rollMax: List[int]) -> int:dp = [[[0 for i in range(16)] for i in range(6)] for i in range(n)]for j in range(6):dp[0][j][1] = 1for i in range(1,n):for j in range(6):for k in range(1,16):if dp[i-1][j][k]==0:continuefor nj in range(6):if nj==j and k+1 <= rollMax[j]:dp[i][nj][k+1] = (dp[i][nj][k+1]+dp[i-1][j][k])%1000000007if nj!=j:dp[i][nj][1] = (dp[i][nj][1]+dp[i-1][j][k])%1000000007;sum = 0for j in range(6):for k in range(1,16):sum = (sum+dp[n-1][j][k])%1000000007return sum
2776 ms 30 MB
python这么慢吗?
LeetCode 1223. 掷骰子模拟(DP)相关推荐
- Leetcode.1223 掷骰子模拟
题目链接 Leetcode.1223 掷骰子模拟 Rating : 2008 题目描述 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时 ...
- leetcode - 1223. 掷骰子模拟
1223. 掷骰子模拟 有一个骰子模拟器会每次投掷的时候生成一个 111 到 666 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 iii 的次数不能超过 rollMax ...
- Leetcode 1223. 掷骰子模拟【动态规划】
有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始编号). 现 ...
- (C++/Python)LeetCode 1223 掷骰子模拟
自言自语: 做很多动规的题目了,但是总是感觉拿到题目没有思路: 动态规划,就是从0开始变化,或者从后开始变化 所以就是要找到转移方程,dp[i].dp[i][j].dp[i][j][k]中i.j.k代 ...
- 1223. 掷骰子模拟 _动态规划与递归
有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始编号). 现 ...
- LeetCode 1155. 掷骰子的N种方法(DP)
1. 题目 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target,请你 ...
- 实验二 利用Excel表格进行掷骰子模拟实验
应用软件:Office2010 我们想分别进行100次和1000次的掷骰子模拟实验.将Excel表格输入成如下样式: 注意!概率的输入是使用=1/6回车计算的,并非手动输入,如图: 类似于投币实验,点 ...
- 使用 Python 进行 GUI 掷骰子模拟
使用 Python 进行 GUI 掷骰子模拟 原文地址 最后更新 : 02 Aug, 2022 在本文中,我们将使用Tkinter和Python中的随机模块创建Rolling The Dices Ga ...
- leetcode - 1155. 掷骰子的N种方法
这里有 ddd 个一样的骰子,每个骰子上都有 fff 个面,分别标号为 1,2,...,f1, 2, ..., f1,2,...,f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需 ...
最新文章
- e站app改内置hosts_e-Mobile安卓下载-e
- javax.validation.ParameterNameProvider
- 浅析充分挖掘网站外链发挥SEO优化作用的4点技巧!
- 《python3网络爬虫开发实战》--基本库的使用
- 在同一页面显示多个JavaScript统计图表
- 其它综合-CentOS7 忘记root密码
- MySQL学习笔记_8_SQL语言基础复习
- MongoDB 教程索引 (附有视频)
- Java基础学习总结(64)——Java内存管理
- linux系统安装klocwork,linux下klocwork的使用
- 如何复制网上的收费文本
- win10硬盘读写速度测试-crystaldiskmark
- verilog——三八译码器
- 逐飞K66核心板+逐飞DAP下载器调试方式及接线(SWD)
- 使用伪类实现划掉字体
- css盒心形的代码过程,如何使用CSS和D3实现用文字组成的心形动画效果(附代码)...
- 人人商城提示“app被您禁用啦,可以访问lbsyun.baidu.com/apiconsole/key#”
- 【测试方法】业务流测试法之场景法
- 沃信科技T3 Sota安装配置手册(1-4章)
- 鼎利测试软件多少钱_鼎利测试软件窗口详细说明.docx
热门文章
- Random Forest算法参数解释及调优
- FreeRTOS系列第19篇---FreeRTOS信号量
- curl -L get.rvm.io | bash -s stable报错:连接不上服务器
- 程序员修炼之道--从小工到专家(一)
- python3一个简单的网页抓取
- http数据绑定spring mvc详解
- 1045-Access denied for user 'root'@'localhost'(using password:YES)
- 冲刺阶段 day 6
- 二维码扫描利用ZBar实现
- 如何通过PHP将excel的数据导入MySQL中