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格时 ...
随机推荐
- 【JZOJ6230】【20190625】梦批糼
题目 一个$n\times m \times l $的立方体,有一些位置有障碍 一次操作会随机选择一个立方体,共有\(w\)次操作 询问所有操作都不选到障碍点,被选到至少一次的点的期望 $n ,m,l ...
- 面试题必备-web页面基础
html标签是由<>包围的关键词 html标签是成对出现的 有部分标签是没有结束标签的,叫单标签, 页面中所有的内容,都是要放在HTML标签中的 HTML标签分三部分: 标签名称 标签内容 ...
- shell for循环输出目录下的文件名
test.sh文件: #!/bin/bash for file in `ls`;do echo $file done 输出 bogon:test macname$ chmod +x test.sh b ...
- 利用python爬虫爬取图片并且制作马赛克拼图
想在妹子生日送妹子一张用零食(或者食物类好看的图片)拼成的马赛克拼图,因此探索了一番= =. 首先需要一个软件来制作马赛克拼图,这里使用Foto-Mosaik-Edda(网上也有在线制作的网站,但是我 ...
- 分享一个Python脚本--统计redis key类型数据大小分布
概述 今天主要介绍怎么统计redis key类型数据大小分布. 原理:使用redis命令: scan.pipline.type 和 debug object 来得到 redis key 信息. 脚本 ...
- Fluent Meshing生成interface
源视频链接: https://pan.baidu.com/s/1St4o-jB5KRfN5dLsvRe_vQ 提取码: 9rrr
- UDP丢包原因总结
丢包检查方法 给每个UDP包编号,对比收发端的接收到的包.对于UDP协议层上的包,例如RTP包,可以从RTP包中读出包的序列号进行判断. 抓包.发送端和接收端分别抓包.linux下可以使用tcpdum ...
- 【转】PostgreSQL与MySQL比较
转自:https://www.cnblogs.com/geekmao/p/8541817.html PostgreSQL与MySQL比较 特性 MySQL PostgreSQL 实例 通过执行 M ...
- Spring boot与Spring cloud之间的关系
Spring boot 是 Spring 的一套快速配置脚手架,可以基于spring boot 快速开发单个微服务,Spring Boot,看名字就知道是Spring的引导,就是用于启动Spring的 ...
- linux里安装使用svn
1.安装 sudo apt-get install subversion 2.checkout工程 svn checkout svn://192.168.0.3/测试工具 /home/testtool ...