当前位置: 首页 > news >正文

【LeetCode】1223. 掷骰子模拟

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

算法一:动态规划

思路

  • 首先,创建一个二维 dp 数组;

  • dp[i][j] 表示第 i 次掷骰子时,数字 j 出现的可能的序列总数,也就是说,第 i 次掷出的数字是 j 所有可能的序列数 , 其中 1 <= i <= n , 1 <= j <= 6 。

  • 显然, dp[1][1],dp[1][2]… dp[1][6]均为 1 ,所以,最后结果有效序列总数就是 sum (dp[n][1] + dp[n][2] + … + dp[n][6]) , sum为求和函数 。

  • 那么,如何计算第i次骰子掷出时,掷出数字为j的序列总数为多少呢? 仔细思考一下dp[i][j]和什么有关?

    • 第一: dp[i][j] 和dp[i-1][j]有关,不仅如此,dp[i][j] 和 dp[i-1][1], dp[i-1][2],…dp[i-1][6]都有关;
    • 第二: 由于连续数字限制,dp[i][j]还和 dp[i-rollMax[j-1]][1],…,dp[i-rollMax[j-1]][6]均有关;
    • 所以,第i次掷出骰子的序列总数只和第i-1次掷出骰子的序列总数,以及第i-rollMax[j-1]次掷出骰子的序列总数有关。
    • 详细例子看题解。
    • 状态方程为 :
      在这里插入图片描述
  • 需要主要对大数的处理, 使用 int 型很容易越界;

  • 另外,代码中有一个特殊条件的判断,当 idx == 0 时,ans 直接减一 ;此时,第 1 次 ~ 第 i - 1次掷出的都是 k ,即出现了序列 kkk…kk ,因此不合法的情况只有一种,所以减一。

算法情况

  • 时间复杂度:O(6n),即O(n);
  • 空间复杂度:O(7(n+1)),即 O(n)。

在这里插入图片描述

代码

class Solution {
public:const int MOD = 1e9 + 7;typedef long long LL;int dieSimulator(int n, vector<int>& rollMax) {vector<vector<LL> > dp(n+1, vector<LL>(7));// 初始化for (int j = 1; j <= 6; j++) {dp[1][j] = 1;}for (int i = 2; i <= n; i++) {for (int j = 1; j <= 6; j++) {// 加入第 i-1 次得所有可能序列总数LL ans = accumulate(dp[i-1].begin(), dp[i-1].end(), 0LL);int idx = i - 1 - rollMax[j-1];if (idx >= 1) {// 减去 i - 1 - rollMax[j-1]次掷出除j外其他五个数的所有序列总数ans = accumulate(dp[idx].begin(), dp[idx].end(), ans, [&](LL init, LL e) {return init + MOD - e;});ans += dp[idx][j];}else if (idx == 0) {// 特殊情况处理ans -= 1;}dp[i][j] = ans % MOD;}}return accumulate(dp[n].begin(), dp[n].end(), 0LL) % MOD;}
};

参考资料:

  1. 超简单动态规划! 复杂度O(n)

相关文章:

【LeetCode】1223. 掷骰子模拟

1223. 掷骰子模拟 题目描述 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数。 不过我们在使用它时有个约束&#xff0c;就是使得投掷骰子时&#xff0c;连续 掷出数字 i 的次数不能超过 rollMax[i]&#xff08;i 从 1 开始编号&#xff09;。 现在&#xff0c;…...

SPSS数据分析软件的安装与介绍(附网盘链接)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

2022年38女神节大促美妆、珠宝、母婴、保健电商数据回顾

近期&#xff0c;我们陆续接收到了品牌商家朋友们对于2022年女神节大促期间部分品类的数据需求&#xff0c;希望能对今年的大促活动有一个更宏观的认知、更精准的预测&#xff0c;从而拿到更好的数据效果。 为此&#xff0c;在距离大促开启一个月的备货阶段&#xff0c;鲸参谋决…...

Java笔记-线程同步

目录线程的同步---以三个窗口售票100张为例方式一&#xff1a;同步代码块方式二&#xff1a;同步方法使用同步机制的作用&#xff1a;线程的同步—以三个窗口售票100张为例 &#xff08;1&#xff09;问题&#xff1a;卖票的过程出现重票和错票 &#xff08;2&#xff09;原因…...

通过python 调用OpenAI api_key提交问题解答

通过python 调用OpenAI api_key提交问题解答✨可以通过网页版的jupyter notebook调用&#xff0c;也可以通过spyder窗口等IDE窗口. &#x1f33c;通过python 调用OpenAI api_key接口&#xff0c;可以避免国内网页不能访问的问题。前提是需要自己已经注册了OpenAI帐号&#xff…...

图表控件LightningChart .NET再破世界纪录,支持实时可视化 1 万亿个数据点

LightningChart.NET SDK 是一款高性能数据可视化插件工具&#xff0c;由数据可视化软件组件和工具类组成&#xff0c;可支持基于 Windows 的用户界面框架&#xff08;Windows Presentation Foundation&#xff09;、Windows 通用应用平台&#xff08;Universal Windows Platfor…...

什么是响应性?

响应性&#xff1a; 这个术语在今天的各种编程讨论中经常出现&#xff0c;但人们说它的时候究竟是想表达什么意思呢&#xff1f;本质上&#xff0c;响应性是一种可以使我们声明式地处理变化的编程范式。一个经常被拿来当作典型例子的用例即是 Excel 表格&#xff1a; 这里单元…...

黑马】后台管理176-183

一、新建订单管理的分支二、创建一个订单管理的vue文件进行组件页面的路由配置import Order from ../components/order/Order.vue{path:/orders,component:Order},注意上面的components不要忘记少加一个s&#xff01;三&#xff0c;获取后台数据面包屑导航粘贴过来文本输入框&a…...

Typescript - 类型守卫(typeof / in / instanceof / 自定义类型保护的类型谓词)通俗易懂详细教程

前言 类型守卫用于获取变量类型信息&#xff0c;通常使用在条件块语句中。类型守卫是返回布尔值的常规函数&#xff0c;接受一个类型并告诉 TypeScript 是否可以缩小到更具体的类型。类型守卫具有唯一的属性&#xff0c;可以确保测试的值返回的是布尔值类型。 TypeScript 使用了…...

6.8 左特征向量

特征值很复杂&#xff0c;除了普通的特征向量外&#xff0c;还有左特征向量和广义特征向量。先说说比较容易的左特征向量吧。它是这样定义的&#xff0c;AAA是一个矩阵&#xff0c;λ\lambdaλ是它的一个特征值&#xff0c;下面的向量yyy就是矩阵关于特征值的左特征向量left ei…...

10个自动化测试框架,测试工程师用起来

软件行业正迈向自主、快速、高效的未来。为了跟上这个高速前进的生态系统的步伐&#xff0c;必须加快应用程序的交付时间&#xff0c;但不能以牺牲质量为代价。快速实现质量是必要的&#xff0c;因此质量保证得到了很多关注。为了满足卓越的质量和更快的上市时间的需求&#xf…...

城市C友会【官方牵头更多的线下交流的机会,你有怎样的期待?】

文章目录&#x1f31f; 课前小差&#x1f31f; 长沙线下&#x1f31f; C友会你也可以是组织者&#x1f31f; 线下交流提升价值&#x1f31f; 官方与抖音合作&#xff1f;&#x1f31f; 23年动起来&#x1f31f; 写在最后&#x1f31f; 课前小差 哈喽&#xff0c;大家好&#x…...

CSDN 编程竞赛二十七期题解

竞赛总览 CSDN 编程竞赛二十七期&#xff1a;比赛详情 (csdn.net) 四道题都不难&#xff0c;本来十分钟内就可以解决&#xff0c;但是这次竞赛bug比较多&#xff0c;体验不是很好。 竞赛题解 题目1、幸运数字 小艺定义一个幸运数字的标准包含三条&#xff1a;1、仅包含4或…...

RMI攻击中的ServerClient相互攻击反制

前言 前文中&#xff0c;我们分析了攻击Registry的两种方式&#xff0c;这里我们接着前面的内容&#xff0c;分析Server和Client的相互攻击方式。 Attacked Server Attacked By Client 首先我们搭建个示例&#xff0c;这里直接注册端和服务端放置在一起。 package pers.rm…...

值类型和引用类型

一、值类型和引用类型示例&#xff1a; 值类型&#xff1a;基本数据类型系列&#xff0c;如&#xff1a;int&#xff0c;float&#xff0c;bool&#xff0c;string&#xff0c;数组和结构体等。 引用类型&#xff1a;如&#xff1a;指针&#xff0c;slice切片&#xff0c;map&a…...

后端开发必懂nginx面试40问

什么是Nginx&#xff1f; Nginx是一个 轻量级/高性能的反向代理Web服务器&#xff0c;用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议。他实现非常高效的反向代理、负载平衡&#xff0c;他可以处理2-3万并发连接数&#xff0c;官方监测能支持5万并发&#xff0c;现在中国使用ngin…...

Redis为什么这么快?

1.基于内存存储实现 在MySQL数据库中,所有的读写操作都要通过IO的方式从硬盘中获取。在Redis中,所有的操作都是基于内存实现的,从而减少IO操作提高数据库性能。 2.高效的数据结构 SAS简单动态字符串 字符串长度:SAS查询的时间复杂度O(1),c语言中时间复杂度O(n)空间分配来…...

几种实现主题切换的方式

几种实现主题切换的方式 1. 利用 prefers-color-scheme 特性 prefers-color-scheme是CSS 媒体特性【media】用于检测用户是否有将操作系统的主题色设置为亮色【light】或者暗色【dark】。 当前prefers-color-scheme新特性支持各大主流电脑&#xff08;window和IOS系统&#…...

Jenkins使用(代码拉取->编译构建->部署上线)

Jenkins简介 Jenkins是一个开源项目&#xff0c;提供了一种易于使用的持续集成系统&#xff0c;使开发者从繁杂的集成中解脱出来&#xff0c;专注于更重要的业务逻辑实现上。同时Jenkins能实时监控集成中存在的错误&#xff0c;提供详细的日志文件和提醒功能&#xff0c;还能用…...

IEEE期刊论文投稿前期准备

目录 1、简介 2、资料准备 TPAMI 投稿须知 Letex模板资料下载 下载参考文献Bib文件...

避坑指南:如何在torch 2.4.0 + CUDA 12.1环境下成功安装llamafactory及其依赖

深度避坑&#xff1a;PyTorch 2.4.0与CUDA 12.1环境下的Llamafactory全栈部署实战 当开发者尝试在PyTorch 2.4.0和CUDA 12.1环境下部署Llamafactory时&#xff0c;往往会陷入依赖地狱——从Torch版本误装到vllm模块缺失&#xff0c;每个环节都可能成为耗时数小时的深坑。本文将…...

asp毕业设计下载(全套源码+配套论文)——基于asp+sqlserver的WEB社区论坛设计与实现

基于aspsqlserver的WEB社区论坛设计与实现&#xff08;毕业论文程序源码&#xff09; 大家好&#xff0c;今天给大家介绍基于aspsqlserver的WEB社区论坛设计与实现&#xff0c;更多精选毕业设计项目下载见文末哦。 文章目录&#xff1a; 基于aspsqlserver的WEB社区论坛设计与…...

OpenClaw多模态探索:Qwen3-32B+RTX4090D镜像截图转报告实践

OpenClaw多模态探索&#xff1a;Qwen3-32BRTX4090D镜像截图转报告实践 1. 为什么选择这个技术组合 上周团队头脑风暴时&#xff0c;我遇到了一个典型痛点&#xff1a;会议室白板上写满了讨论要点&#xff0c;但拍照后整理成电子版纪要需要手动誊写半小时。作为技术负责人&…...

如何构建你的第一个Python高频交易模型:完整实战指南

如何构建你的第一个Python高频交易模型&#xff1a;完整实战指南 【免费下载链接】High-Frequency-Trading-Model-with-IB A high-frequency trading model using Interactive Brokers API with pairs and mean-reversion in Python 项目地址: https://gitcode.com/gh_mirror…...

遗传算法 TWVRP 运筹优化调度 混合整数规划 带时间窗多车的物流配送路径优化 贵有贵的道理...

遗传算法 TWVRP 运筹优化调度 混合整数规划 带时间窗多车的物流配送路径优化 贵有贵的道理&#xff0c;代码质量高&#xff0c;有中文注释 只有修改表格中数据即可生成想要的配送路径上周点奶茶发现骑手绕了远路还差点超时&#xff0c;突然就想起之前折腾过的带时间窗多车配送路…...

CREST:如何用5分钟开启分子构象探索之旅?

CREST&#xff1a;如何用5分钟开启分子构象探索之旅&#xff1f; 【免费下载链接】crest Conformer-Rotamer Ensemble Sampling Tool based on the xtb Semiempirical Extended Tight-Binding Program Package 项目地址: https://gitcode.com/gh_mirrors/crest/crest 在…...

VitePress 博客主题定制与美化实战

1. VitePress主题美化的核心思路 很多开发者在使用VitePress搭建博客时&#xff0c;都会遇到一个共同的问题&#xff1a;默认主题虽然简洁&#xff0c;但缺乏个性。我在实际项目中发现&#xff0c;通过CSS变量覆盖、自定义组件和插件扩展这三个维度&#xff0c;可以打造出极具辨…...

手把手教你用魔塔社区+LLaMA-Factory,免费微调Qwen2.5-7B模型(保姆级避坑指南)

零成本玩转Qwen2.5-7B微调&#xff1a;魔塔社区LLaMA-Factory实战手册 最近在开源模型社区里&#xff0c;Qwen2.5系列凭借其优秀的对话能力和中文理解表现&#xff0c;迅速成为开发者们的新宠。但很多朋友反馈&#xff0c;虽然想尝试微调这个模型来适配自己的业务场景&#xff…...

目标检测新手必看:如何用Python手写IOU计算函数(附完整代码)

目标检测实战&#xff1a;从零编写Python版IOU计算函数 刚接触目标检测时&#xff0c;最让人困惑的莫过于那些神秘的评估指标。其中IOU&#xff08;交并比&#xff09;就像一把尺子&#xff0c;能量化算法预测框与真实框的贴合程度。但纸上得来终觉浅&#xff0c;今天我们就用P…...

GLM-OCR模型安装包制作:将模型与服务打包成可执行文件

GLM-OCR模型安装包制作&#xff1a;将模型与服务打包成可执行文件 你是不是也遇到过这样的情况&#xff1f;自己好不容易把一个AI模型跑起来了&#xff0c;效果也不错&#xff0c;想分享给同事或者朋友用用&#xff0c;结果对方光是配环境、装依赖就折腾了半天&#xff0c;最后…...