题目描述

有一个骰子模拟器会每次投掷的时候生成一个 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

思路

用一个三维数组d[i][j][k](i<=n,j<=6,k<=rollMax[j])表示第i次枚举,第j个面连续出现k次的解的数量,即以k个j结尾的数列的情况总数。

递推关系如下:

情况1:这一层的面和上一层相同,当前d[i][j][t]+=d[i-1][j][t-1],t表示j到当前层位置连续出现的次数,2≤t≤rollMax[j]。

情况2:这一层的面和上一层不同,当前d[i][j][1]+=d[i-1][last][lasttimes],last代表上一次出现的数字,lasttimes代表上一次出现的数字连续出现的次数

代码

//用一个三维数组d[i][j][k],表示第i次(1-n)枚举,第j个面(1-6),连续出现k次的解的数量,也就是以k个j结尾的数列的情况总数
class Solution {
public:int dieSimulator(int n, vector<int>& rollMax) {int res=0;int mod=1000000007;int d[n+1][7][16]={0};//要给第一次枚举赋值for(int i=1;i<=6;i++) d[1][i][1]=1;//第i次枚举for(int i=1;i<=n;i++){//骰子的六个面for(int j=1;j<=6;j++){//上一次出现的数枚举for(int last=1;last<=6;last++){//这次的数和上一次一样,重复了if(last==j){//本层至少出现两次,计数从2开始for(int lasttimes=2;lasttimes<=rollMax[last-1];lasttimes++){d[i][j][lasttimes]=(d[i][j][lasttimes]+d[i-1][last][lasttimes-1])%mod;
//这里保证了数组中每隔值都不超过mod}}//这一次的数和上一次不一样,第一次出现else{//上一次出现的数可能出现1次两次...到max次for(int lasttimes=1;lasttimes<=rollMax[last-1];lasttimes++){d[i][j][1]=(d[i][j][1]+d[i-1][last][lasttimes])%mod;}}}}}for(int i=1;i<=6;i++){for(int j=1;j<=rollMax[i-1];j++){//每一个面出现的次数最多为rollMax中规定的最大值res=(res+d[n][i][j])%mod;}}return int(res);}
};

总结

这道题本来的想法是用排列组合,先用6^n算出所有可能的情况,然后再减去不可能的情况数量,后来发现,n的最大值是5000,6^5000过大,而且计算不可能的情况的过程有些麻烦,就放弃了这个思路。

发现这类需要枚举的问题适合用多维数组去解决,让多维数组的每个维度对应问题中的一个有意义的值。多维数组迭代到最后计算出符合条件的解(第n层)。

ps这道题也说明结果值很大的题不一定需要用到long long,通过合适地方的取余运算,int类型就可以解决。

leetcode投骰子问题动态规划相关推荐

  1. 习题3.3投骰子的随机游戏

    /* 题目:每个骰子有六面,点数分别为1,2,3,4,5,6.游戏者在开始输入一个无符号整数,作为产生随机数的种子. 每次投两次骰子,第一轮如果和数为7或11则为胜,游戏结束:和数为2,3或12则为败 ...

  2. C++产生随机数的例题:投骰子的随机游戏

    用例题来理解 功能分块 一.rollDice()函数:负责模拟投骰子,计算和数并输出和数 二.rand()函数:求出并返回一个伪随机数. 伪随机数:你可以写一个循环,每次调用rand函数产生一个随机数 ...

  3. 投骰子游戏(C++)

    每个骰子有六面,点数分别为1.2.3.4.5.6 游戏者在程序开始时输入一个无符号整数,作为产生随机数的种子 每轮投两次骰子,第一轮如果和数为7或11则为胜,游戏结束; 和数为2.3或12则为负,游戏 ...

  4. LeetCode刷题笔记-动态规划-day4

    文章目录 LeetCode刷题笔记-动态规划-day4 55. 跳跃游戏 1.题目 2.解题思路 3.代码 45. 跳跃游戏 II 1.题目 2.解题思路 3.代码 LeetCode刷题笔记-动态规划 ...

  5. 抱歉,Xposed真的可以为所欲为——4.猜拳投骰子你能赢算我输

    抱歉,Xposed真的可以为所欲为--4.猜拳投骰子你能赢算我输 标签: 2018 一句话概括本文 人品大法利用Xposed Hook掉微信猜拳和投骰子,让你无需再担忧拿外卖和搞卫生. 引言 关于这节 ...

  6. 抱歉,Xposed真的可以为所欲为——4.猜拳投骰子你能赢算我输(转载)

    一句话概括本文 人品大法利用Xposed Hook掉微信猜拳和投骰子,让你无需再担忧拿外卖和搞卫生. 引言 关于这节,我是看代码看到头皮发麻,逆向APP并没有想想中的简单, 特别是微信这种,要投入的学 ...

  7. python投掷骰子实验实验结论_博饼伤我心我,决定用Python对投骰子(色子)做数据分析...

    pygal 是非常不错的 python 可视化包,它可以生成矢量图,从而在不同尺寸的屏幕上都可以获得良好的显示效果.具体安装使用请参考官方文档.今天小狼举个投骰子的栗子,看一下不同点数的概率分布情况. ...

  8. Java类的编写实例(一 )SnakeEyes 投骰子中出现蛇眼(双幺)的次数 如何创建新的类和成员

    初学者编写一个只包含main方法的单一类,是一个很小但是完整的程序.这样的程序通常使用Java类库中预定义的类来实例化对象,然后使用这些对象提供的服务.尝试编写新的程序,用到的类不完全是Java类库中 ...

  9. Python投骰子小游戏

    今天我们用Python来实现一个投骰子小游戏,这个小游戏比之前写的要复杂一点点,不过大家不用担心,只要大家掌握了基本的语句就可以写出来了 游戏具体内容如下: #投骰子 #玩两个骰子 : 1-6 #1. ...

最新文章

  1. Python接口自动化测试框架(基础篇)-- 流程控制之循环语句forwhile
  2. 如何在一个文件中写多个Vue组件(译-有删改)
  3. 《Swift编程语言教程》中文翻译及读书笔记page21
  4. java实现二叉树的构建以及3种遍历方法
  5. Java高效读取大文件
  6. flask连接不到mysql数据库,即使使用了python flask mysql,也无法将数据提交到数据库(使用python flask mysql)连接.提交()...
  7. python完全支持面向对象编程_Python面向对象编程
  8. 配置普通用户可以运行saltstack的模块
  9. aimesh node重启_ASSIMP的数据结构
  10. JVM(三)对象的生死判定和算法详解
  11. 使用 WorkflowIdentity 和版本控制
  12. 计算机类和数学与应用数学哪个好,数学与应用数学专业怎么样 好不好找工作...
  13. 恒大汽车自救进行时:恒驰5进入试产阶段,离量产只差道路准入许可
  14. centos 6.5 php nginx,CentOS6.5上安装nginx与php5.5
  15. 2.4gwifi最高下载速度_2.4G+5G双频合一的路由器速度会更快?看完后才知道还好没上当...
  16. PyTorch:模型层和nn container
  17. ubuntu20.04安装qq和微信
  18. c语言中判断c是否为小写字母,C语言判断英文字符大小写的方法
  19. React Concurrent Mode 之 Suspense 实践
  20. 【能效管理】电力监控系统在某商业数据中心的应用分析

热门文章

  1. 如何用visual studio 2017建立一个python项目并且编写一段简单代码
  2. 9325寄存器详细说明
  3. GDevelop 5开发经验分享之 Coriander Games 工作室开发游戏的经验分享
  4. 初识Jackson——世界上最好的JSON库
  5. 8.试用期工作总结八
  6. 七夕节王者荣耀服务器维护,王者荣耀8月14日维护更新公告 20181七夕活动内容介绍...
  7. 【程序源代码】共享充电桩小程序(服务端)
  8. 如何找一张相似的图片---高手请绕过,适合初学者
  9. 联想小新Air Fn+Q失效
  10. 仅一个月涨粉89w,粉丝数不到100w的他到底做对了什么?