LeetCode 1223. 掷骰子模拟 Dice Roll Simulation - Java - DP
题目链接:1223. 掷骰子模拟
有一个骰子模拟器会每次投掷的时候生成一个 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
时间复杂度: \(O(n×6^2)\)
空间复杂度: \(O(n)\)
Java代码:
class Solution {
private int mod = 1000000007;
public int dieSimulator(int n,
int[] rollMax) {
long[][] dp = new long[n + 1][7];
for (int point = 1; point <= 6; ++point) {
dp[1][point] = 1;
}
for (int i = 2; i <= n; ++i) {
for (int j = 1; j <= 6; ++j) {
dp[i][j] = getNum(dp, i, j, rollMax) % mod;
}
}
long ret = 0;
for (int point = 1; point <= 6; ++point) {
ret += dp[n][point];
ret %= mod;
}
if (ret < 0) {
ret += mod;
}
return (int) ret;
}
private long getNum(long[][] dp,
int i,
int j,
int[] rollMax) {
long ret = 0;
for (int point = 0; point <= 6; ++point) {
ret += dp[i - 1][point];
ret %= mod;
}
int repeatNum = rollMax[j - 1];
// 去掉重复的统计数据
if (i > repeatNum) {
ret -= getRepeat(dp, i - 1, j, repeatNum);
ret %= mod;
}
return ret;
}
private long getRepeat( long[][] dp,
int i,
int j,
int repeatNum) {
if (i == repeatNum) {
return 1;
}
if (repeatNum == 1) {
return dp[i][j];
} else {
long ret = 0;
for (int point = 1; point <= 6; ++point) {
if (point != j) {
ret += dp[i - repeatNum][point];
ret %= mod;
}
}
return ret;
}
}
}
Java代码:
// 2019年10月13日22:56:49
// 这是我自己写的,时间复杂度为O(n×6^3)
class Solution {
public int dieSimulator(int n, int[] rollMax) {
int mod = 1000000007;
long [][] arr = new long[n + 1][7];
Arrays.fill(arr[1], 1);
for (int i = 2; i <= n; ++i) {
for (int j = 1; j <= 6; ++j) {
if (rollMax[j - 1] == 1) {
for (int k = 1; k <= 6; ++k) {
if (k == j) {
continue;
}
arr[i][j] += arr[i - 1][k];
arr[i][j] %= mod;
}
continue;
}
if (i - rollMax[j - 1] < 1) {
for (int k = 1; k <= 6; ++k) {
arr[i][j] += arr[i - 1][k];
arr[i][j] %= mod;
}
continue;
}
for (int k = 1; k <= 6; ++k) {
if (k == j) {
for (int k1 = 1; k1 <= 6; ++k1) {
if (k1 != j) {
arr[i][j] += arr[i - rollMax[j - 1]][k1];
arr[i][j] %= mod;
}
}
continue;
}
arr[i][j] += arr[i - 1][k];
arr[i][j] %= mod;
}
}
}
long ret = 0;
for (long a : arr[n]) {
ret += a;
ret %= mod;
}
return (int) ret;
}
}
原文链接:https://blog.csdn.net/pfdvnah/article/details/102539644
LeetCode 1223. 掷骰子模拟 Dice Roll Simulation - Java - DP的更多相关文章
- 记忆化搜索模板题---leetcode 1155. 掷骰子的N种方法
1155. 掷骰子的N种方法 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, ..., f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数 ...
- python应用-掷骰子模拟-pygal
pygal安装: Linux下: pip install pygal Windows下: python -m pip install pygal 效果如图: # -*- coding: utf-8 - ...
- LeetCode.874-走路机器人模拟(Walking Robot Simulation)
这是悦乐书的第335次更新,第360篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第205题(顺位题号是874).网格上的机器人从点(0,0)开始并朝北.机器人可以接收三 ...
- 【HDOJ5955】Guessing the Dice Roll(概率DP,AC自动机,高斯消元)
题意: 有n个人,每个人有一个长为L的由1~6组成的数串,现在扔一个骰子,依次记录扔出的数字,如果当前扔出的最后L个数字与某个人的数串匹配,那么这个人就算获胜,现在问每个人获胜的概率是多少. n,l& ...
- Python 使用matplotlib模块模拟掷骰子
掷骰子 骰子类 # die.py 骰子类模块 from random import randint class Die(): """骰子类""&quo ...
- Python绘制直方图 Pygal模拟掷骰子
#coding=utf-8 from random import randint class Die(): """骰子类""" def __ ...
- 使用python实现模拟掷骰子数据分析
Data:2020/4/8 主题:模拟实现掷骰子数据分析 编译环境:pycharm 库:pygal 说明: code 1:创建一个掷骰子类对象,类方法获得掷骰子随机数1-6,默认6个面,模拟20次将结 ...
- Python Tkinter小实例——模拟掷骰子
什么是Tkinter? Tkinter 是 Python 的标准 GUI 库.Python 使用 Tkinter 可以快速的创建 GUI 应用程序. 由于 Tkinter 是内置到 python 的安 ...
- 【NOIP2012模拟10.31】掷骰子
题目 太郎和一只免子正在玩一个掷骰子游戏.有一个有N个格子的长条棋盘,太郎和兔子轮流掷一个有M面的骰子,骰子M面分别是1到M的数字.且掷到任意一面的概率是相同的.掷到几.就往前走几步.当谁走到第N格时 ...
随机推荐
- 06-图2 Saving James Bond - Easy Version (25 分)
This time let us consider the situation in the movie "Live and Let Die" in which James Bon ...
- [golang][hugo]使用Hugo搭建静态站点
使用Hugo搭建静态站点 hugo下载地址:https://github.com/gohugoio/hugo 模板列表:https://github.com/gohugoio/hugoThemes 开 ...
- AttributeError: module ‘select’ has no attribute 'epoll’
场景:mac 下导入的 ‘select’ 包 import select,然后在 主函数 中创建的 epoll 对象 epl = select.epoll(),运行报错如下 Traceback (mo ...
- [1-2] Dependence-Aware Service Function Chain Design and Mapping
文献名称:Dependence-Aware Service Function Chain Design and Mapping 文献类型(期刊.硕论.博论):会议:Globecom 发表年份:2017 ...
- Java重启后不能打开的一些解决方法
点开环境变量设置,重新确定一下(据说是win10的原因) 将环境变量中path与CLASSPATH中的%JAVA_HOME%改为JAVA_HOME的值.参考https://blog.csdn.net/ ...
- Django实现自动发布(3发布-升级和回退)
发布实际上就是将服务的某个版本和一台主机关联,我用一张表(MicroServiceInstance)记录了主机id.服务id.版本id,目前一台主机只能部署一个版本,所以主机id和服务id要做联合索引 ...
- CandyCrush 糖果传奇源码+素材+教程
在这里你将深入学习C#语言和Unity开发游戏的技术.在游戏项目开发中深入学习并掌握Unity开发中的刚体,模型等等 共14讲,TS格式,大小395MB 共14讲,TS格式,大小395MB 扫码时备注 ...
- SpringBoot(十四):SpringCloud初步认识
SpringCloud是一个基于SpringBoot实现的云应用开发工具,它为开发人员提供了一些工具来快速构建分布式系统中的一些常见模式(例如配置管理.服务发现.断路器.智能路由.微代理.控制总线.一 ...
- linux驱动由浅入深系列:高通sensor架构实例分析之三(adsp上报数据详解、校准流程详解)【转】
本文转载自:https://blog.csdn.net/radianceblau/article/details/76180915 本系列导航: linux驱动由浅入深系列:高通sensor架构实例分 ...
- 七年老运维实战中的 Shell 开发经验总结【转】
无论是系统运维,还是应用运维,均可分为“纯手工”—> “脚本化”—> “自动化”—>“智能化”几个阶段,其中自动化阶段,主要是将一些重复性人工操作和运维经验封装为程序或脚本,一方面避 ...