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)相关推荐

  1. Leetcode.1223 掷骰子模拟

    题目链接 Leetcode.1223 掷骰子模拟 Rating : 2008 题目描述 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时 ...

  2. leetcode - 1223. 掷骰子模拟

    1223. 掷骰子模拟 有一个骰子模拟器会每次投掷的时候生成一个 111 到 666 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 iii 的次数不能超过 rollMax ...

  3. Leetcode 1223. 掷骰子模拟【动态规划】

    有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始编号). 现 ...

  4. (C++/Python)LeetCode 1223 掷骰子模拟

    自言自语: 做很多动规的题目了,但是总是感觉拿到题目没有思路: 动态规划,就是从0开始变化,或者从后开始变化 所以就是要找到转移方程,dp[i].dp[i][j].dp[i][j][k]中i.j.k代 ...

  5. 1223. 掷骰子模拟 _动态规划与递归

    有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始编号). 现 ...

  6. LeetCode 1155. 掷骰子的N种方法(DP)

    1. 题目 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target,请你 ...

  7. 实验二 利用Excel表格进行掷骰子模拟实验

    应用软件:Office2010 我们想分别进行100次和1000次的掷骰子模拟实验.将Excel表格输入成如下样式: 注意!概率的输入是使用=1/6回车计算的,并非手动输入,如图: 类似于投币实验,点 ...

  8. 使用 Python 进行 GUI 掷骰子模拟

    使用 Python 进行 GUI 掷骰子模拟 原文地址 最后更新 : 02 Aug, 2022 在本文中,我们将使用Tkinter和Python中的随机模块创建Rolling The Dices Ga ...

  9. leetcode - 1155. 掷骰子的N种方法

    这里有 ddd 个一样的骰子,每个骰子上都有 fff 个面,分别标号为 1,2,...,f1, 2, ..., f1,2,...,f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需 ...

最新文章

  1. e站app改内置hosts_e-Mobile安卓下载-e
  2. javax.validation.ParameterNameProvider
  3. 浅析充分挖掘网站外链发挥SEO优化作用的4点技巧!
  4. 《python3网络爬虫开发实战》--基本库的使用
  5. 在同一页面显示多个JavaScript统计图表
  6. 其它综合-CentOS7 忘记root密码
  7. MySQL学习笔记_8_SQL语言基础复习
  8. MongoDB 教程索引 (附有视频)
  9. Java基础学习总结(64)——Java内存管理
  10. linux系统安装klocwork,linux下klocwork的使用
  11. 如何复制网上的收费文本
  12. win10硬盘读写速度测试-crystaldiskmark
  13. verilog——三八译码器
  14. 逐飞K66核心板+逐飞DAP下载器调试方式及接线(SWD)
  15. 使用伪类实现划掉字体
  16. css盒心形的代码过程,如何使用CSS和D3实现用文字组成的心形动画效果(附代码)...
  17. 人人商城提示“app被您禁用啦,可以访问lbsyun.baidu.com/apiconsole/key#”
  18. 【测试方法】业务流测试法之场景法
  19. 沃信科技T3 Sota安装配置手册(1-4章)
  20. 鼎利测试软件多少钱_鼎利测试软件窗口详细说明.docx

热门文章

  1. Random Forest算法参数解释及调优
  2. FreeRTOS系列第19篇---FreeRTOS信号量
  3. curl -L get.rvm.io | bash -s stable报错:连接不上服务器
  4. 程序员修炼之道--从小工到专家(一)
  5. python3一个简单的网页抓取
  6. http数据绑定spring mvc详解
  7. 1045-Access denied for user 'root'@'localhost'(using password:YES)
  8. 冲刺阶段 day 6
  9. 二维码扫描利用ZBar实现
  10. 如何通过PHP将excel的数据导入MySQL中