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 <= 5000rollMax.length == 61 <= 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格时 ...
随机推荐
- 中国大学生计算机系统与程序设计竞赛 CCF-CCSP-2017 串行调度(serial)
串行调度(serial) 除等价条件, 根据题意设置限制条件,然后求字典序最小拓扑序. 简洁版 #include<bits/stdc++.h> using namespace std; ; ...
- 使用Visual Studio Code编辑Processing
最近想弄Sublime Text 3写Processing,但由于各种不知名原因导致无法编译,就想着换自去年以来超火的VScode试一下,还真给我试成功了. 1.下载https://code.visu ...
- Android编程权威指南笔记
学习android开发,你需要对java语言,包括类,对象,接口,监听器,包,内部类,匿名内部类有所了解. android studio 的下载与安装 可以从android开发者网站下载android ...
- 重装了服务器,用的是centos/php微信小程序版,centos 命令大全
centos 命令大全 1.关机 (系统的关机.重启以及登出 ) 的命令 shutdown -h now 关闭系统(1) init 0 关闭系统(2) telinit 0 关闭系统(3) shutdo ...
- [CMS] UsualToolCMS-8.0 sql注入漏洞【转载】
原文地址:http://lyscholar.cn/2019/07/30/代码审计-usualtoolcms存在sql注入漏洞/ 0x01 漏洞环境 版本信息:UsualToolCMS-8.0-Rele ...
- <每日 1 OJ> -LeetCode 13 . 罗马数字转正数
题目: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1 ...
- 干掉搜狗输入法云代理SogouCloud.exe
搜狗输入法暂时还离不开,但是很讨厌搜狗输入法一直在后台的"搜狗云代理程序"(C:\Program Files (x86)\SogouInput\9.1.0.2657\SogouCl ...
- sumdoc t411 dir.txt
C:\Users\zhoufeiyue\Documents\sumdoc t411\(9+条消息)redis Jedis存取list对象和map - shenjianxz的博客 - CSDN博客.mh ...
- 解决在SQLPLUS中无法使用方向键、退格键问题
1. wget ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/matthewdva:/build:/E ...
- Celery 服务搭建
整个项目工程如下 __init__.py """ 注意点:python3.7 需要执行 pip install --upgrade https://github.com/ ...