leetcode投骰子问题动态规划
题目描述
有一个骰子模拟器会每次投掷的时候生成一个 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投骰子问题动态规划相关推荐
- 习题3.3投骰子的随机游戏
/* 题目:每个骰子有六面,点数分别为1,2,3,4,5,6.游戏者在开始输入一个无符号整数,作为产生随机数的种子. 每次投两次骰子,第一轮如果和数为7或11则为胜,游戏结束:和数为2,3或12则为败 ...
- C++产生随机数的例题:投骰子的随机游戏
用例题来理解 功能分块 一.rollDice()函数:负责模拟投骰子,计算和数并输出和数 二.rand()函数:求出并返回一个伪随机数. 伪随机数:你可以写一个循环,每次调用rand函数产生一个随机数 ...
- 投骰子游戏(C++)
每个骰子有六面,点数分别为1.2.3.4.5.6 游戏者在程序开始时输入一个无符号整数,作为产生随机数的种子 每轮投两次骰子,第一轮如果和数为7或11则为胜,游戏结束; 和数为2.3或12则为负,游戏 ...
- LeetCode刷题笔记-动态规划-day4
文章目录 LeetCode刷题笔记-动态规划-day4 55. 跳跃游戏 1.题目 2.解题思路 3.代码 45. 跳跃游戏 II 1.题目 2.解题思路 3.代码 LeetCode刷题笔记-动态规划 ...
- 抱歉,Xposed真的可以为所欲为——4.猜拳投骰子你能赢算我输
抱歉,Xposed真的可以为所欲为--4.猜拳投骰子你能赢算我输 标签: 2018 一句话概括本文 人品大法利用Xposed Hook掉微信猜拳和投骰子,让你无需再担忧拿外卖和搞卫生. 引言 关于这节 ...
- 抱歉,Xposed真的可以为所欲为——4.猜拳投骰子你能赢算我输(转载)
一句话概括本文 人品大法利用Xposed Hook掉微信猜拳和投骰子,让你无需再担忧拿外卖和搞卫生. 引言 关于这节,我是看代码看到头皮发麻,逆向APP并没有想想中的简单, 特别是微信这种,要投入的学 ...
- python投掷骰子实验实验结论_博饼伤我心我,决定用Python对投骰子(色子)做数据分析...
pygal 是非常不错的 python 可视化包,它可以生成矢量图,从而在不同尺寸的屏幕上都可以获得良好的显示效果.具体安装使用请参考官方文档.今天小狼举个投骰子的栗子,看一下不同点数的概率分布情况. ...
- Java类的编写实例(一 )SnakeEyes 投骰子中出现蛇眼(双幺)的次数 如何创建新的类和成员
初学者编写一个只包含main方法的单一类,是一个很小但是完整的程序.这样的程序通常使用Java类库中预定义的类来实例化对象,然后使用这些对象提供的服务.尝试编写新的程序,用到的类不完全是Java类库中 ...
- Python投骰子小游戏
今天我们用Python来实现一个投骰子小游戏,这个小游戏比之前写的要复杂一点点,不过大家不用担心,只要大家掌握了基本的语句就可以写出来了 游戏具体内容如下: #投骰子 #玩两个骰子 : 1-6 #1. ...
最新文章
- Python接口自动化测试框架(基础篇)-- 流程控制之循环语句forwhile
- 如何在一个文件中写多个Vue组件(译-有删改)
- 《Swift编程语言教程》中文翻译及读书笔记page21
- java实现二叉树的构建以及3种遍历方法
- Java高效读取大文件
- flask连接不到mysql数据库,即使使用了python flask mysql,也无法将数据提交到数据库(使用python flask mysql)连接.提交()...
- python完全支持面向对象编程_Python面向对象编程
- 配置普通用户可以运行saltstack的模块
- aimesh node重启_ASSIMP的数据结构
- JVM(三)对象的生死判定和算法详解
- 使用 WorkflowIdentity 和版本控制
- 计算机类和数学与应用数学哪个好,数学与应用数学专业怎么样 好不好找工作...
- 恒大汽车自救进行时:恒驰5进入试产阶段,离量产只差道路准入许可
- centos 6.5 php nginx,CentOS6.5上安装nginx与php5.5
- 2.4gwifi最高下载速度_2.4G+5G双频合一的路由器速度会更快?看完后才知道还好没上当...
- PyTorch:模型层和nn container
- ubuntu20.04安装qq和微信
- c语言中判断c是否为小写字母,C语言判断英文字符大小写的方法
- React Concurrent Mode 之 Suspense 实践
- 【能效管理】电力监控系统在某商业数据中心的应用分析
热门文章
- 如何用visual studio 2017建立一个python项目并且编写一段简单代码
- 9325寄存器详细说明
- GDevelop 5开发经验分享之 Coriander Games 工作室开发游戏的经验分享
- 初识Jackson——世界上最好的JSON库
- 8.试用期工作总结八
- 七夕节王者荣耀服务器维护,王者荣耀8月14日维护更新公告 20181七夕活动内容介绍...
- 【程序源代码】共享充电桩小程序(服务端)
- 如何找一张相似的图片---高手请绕过,适合初学者
- 联想小新Air Fn+Q失效
- 仅一个月涨粉89w,粉丝数不到100w的他到底做对了什么?