LeetCode-1223-掷骰子模拟

news2025/3/13 13:18:56

在这里插入图片描述

1、动态规划法

我们可以利用数组 d p [ i ] [ j ] [ k ] dp[i][j][k] dp[i][j][k]来表示当我们已经投过 i i i次骰子,其中第 i i i次投出的骰子是 j j j,此时连续投出骰子 j j j的次数为 k k k。因此我们可以根据上一轮中得到的状态 d p [ i − 1 ] [ j ] [ k ] dp[i-1][j][k] dp[i1][j][k],结合本次投骰子获得的结果 p p p得到如下的转移关系:

1、若 p ≠ j p \ne j p=j,则此时我们不需要考虑上一次投骰子对于本次结果的影响,故 d [ i ] [ p ] [ 1 ] = ( d [ i ] [ p ] [ 1 ] + d [ i − 1 ] [ j ] [ k ] ) % m o d d[i][p][1] = (d[i][p][1] + d[i - 1][j][k]) \% mod d[i][p][1]=(d[i][p][1]+d[i1][j][k])%mod
2、若 p = j p=j p=j,则此时我们需要对上一次投出 p p p时的次数进行讨论,若 k + 1 ≤ r o l l M a x [ j ] k + 1 \le rollMax[j] k+1rollMax[j]则说明此时我们连续投出的次数未超过上限,可以继续累加,即 d [ i ] [ p ] [ k + 1 ] = ( d [ i ] [ p ] [ k + 1 ] + d [ i − 1 ] [ j ] [ k ] ) % m o d d[i][p][k + 1] = (d[i][p][k + 1] + d[i - 1][j][k]) \% mod d[i][p][k+1]=(d[i][p][k+1]+d[i1][j][k])%mod,否则说明此时超出上限,赋默认值为0即可。

最终,我们只需要在遍历一遍数组,累加求和 ∑ j = 0 5 ∑ k = 1 r o l l M a x [ j ] d p [ n ] [ j ] [ k ] \sum_{j=0}^{5}\sum_{k=1}^{rollMax[j]}dp[n][j][k] j=05k=1rollMax[j]dp[n][j][k]即可。

class Solution {
public:
    static constexpr int mod = 1E9 + 7;
    int dieSimulator(int n, vector<int>& rollMax) {
        vector d(n + 1, vector(6, vector<int>(16)));
        for (int j = 0; j < 6; j++) {
            d[1][j][1] = 1;
        }
        for (int i = 2; i <= n; i++) {
            for (int j = 0; j < 6; j++) {
                for (int k = 1; k <= rollMax[j]; k++) {
                    for (int p = 0; p < 6; p++) {
                        if (p != j) {
                            d[i][p][1] = (d[i][p][1] + d[i - 1][j][k]) % mod;
                        } else if (k + 1 <= rollMax[j]) {
                            d[i][p][k + 1] = (d[i][p][k + 1] + d[i - 1][j][k]) % mod;
                        }
                    }
                }
            }
        }
        
        int res = 0;
        for (int j = 0; j < 6; j++) {
            for (int k = 1; k <= rollMax[j]; k++) {
                res = (res + d[n][j][k]) % mod;
            }
        }
        return res;
    }
};

2、动态规划法优化

我们可以定义状态 d p [ i ] [ j ] dp[i][j] dp[i][j]表示已经完成 i i i次投骰子,其中第 i i i次投出是 j j j的合法序列数,显然我们可以得到状态转移公式如下: d p [ i ] [ j ] = ∑ t = 1 r o l l M a x [ j ] ∑ k = 0 k ≠ j 5 d [ i − t ] [ k ] dp[i][j]=\sum_{t=1}^{rollMax[j]}\sum_{\begin{matrix} k=0\\k\ne j\end{matrix}}^{5} d[i-t][k] dp[i][j]=t=1rollMax[j]k=0k=j5d[it][k],表示当我们需要求 d p [ i ] [ j ] dp[i][j] dp[i][j]时,可以从上一次不为 j j j的位置开始累加。
基于上式,我们可以发现 d p [ i − 1 ] [ j ] dp[i−1][j] dp[i1][j] d p [ i ] [ j ] dp[i][j] dp[i][j]存在大量相同项,可以表示为:
d p [ i ] [ j ] = ∑ k = 0 5 d p [ i − 1 ] [ k ] − ∑ k = 0 k ≠ j 5 d p [ i − r o l l M a x [ j ] − 1 ] [ k ] dp[i][j]=\sum_{k=0}^{5}dp[i-1][k]-\sum_{\begin{matrix}k=0\\k\ne j\end{matrix}}^{5}dp[i-rollMax[j]-1][k] dp[i][j]=k=05dp[i1][k]k=0k=j5dp[irollMax[j]1][k]

class Solution {
public:
    static constexpr int mod = 1E9 + 7;
    int dieSimulator(int n, vector<int>& rollMax) {
        vector d(n + 1, vector<int>(6, 0));
        vector<int> sum(n + 1, 0);
        sum[0] = 1;
        for (int i = 1; i <= n; i++) {
            for (int j = 0; j < 6; j++) {
                int pos = max(i - rollMax[j] - 1, 0);
                int sub = ((sum[pos] - d[pos][j]) % mod + mod) % mod;
                d[i][j] = ((sum[i - 1] - sub) % mod + mod) % mod;
                if (i <= rollMax[j]) {
                    d[i][j] = (d[i][j] + 1) % mod;
                }
                sum[i] = (sum[i] + d[i][j]) % mod;
            }
        }
        return sum[n];
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/338040.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最小二乘支持向量机”在学习偏微分方程 (PDE) 解方面的应用(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 本代码说明了“最小二乘支持向量机”在学习偏微分方程 &#xff08;PDE&#xff09; 解方面的应用。提供了一个示例&#xff0c…

加盟管理系统挑选法则,看完不怕被坑!

经营服装连锁店铺究竟有多难&#xff1f;小编已经不止一次听到身边的老板&#xff0c;抱怨加盟连锁店铺难以管理了&#xff0c;但同时呢&#xff0c;也听到了很多作为加盟商的老板&#xff0c;抱怨总部给的支持和管理不到位。服装加盟店铺管理&#xff0c;到底有哪些难点呢&…

BFS广度优先遍历——Acwing 844. 走迷宫

1.BFS简介我们可以将bfs当做一个成熟稳重的人&#xff0c;一个眼观六路耳听八方的人&#xff0c;他每次搜索都是一层层的搜索&#xff0c;从第一层扩散到最后一层&#xff0c;BFS可以用来解决最短路问题。2.基本思想从初始状态S开始&#xff0c;利用规则&#xff0c;生成所有可…

window11 安装node及配置环境变量

一、安装环境 本教程演示的环境&#xff1a; 系统&#xff1a;win 11 64位 node.js下载地址: http://nodejs.cn/ node.js版本&#xff1a;长期支持版本&#xff08;本教程基于16.15.0&#xff09; 点击选中图标下载到电脑本地即可。 二、安装步骤 1、双击安装包&#xff0c;一…

华为10年经验测试工程师,整理出来的python自动化测试实战

前言 全书共分11章&#xff0c;第一章是基础&#xff0c;了selenium家谱&#xff0c;各种组件之间的关系以及一些必备知识。第二章告诉如何开始用python IDLE写程序以及自动化测试环境的搭建。第三章是webdriver API&#xff0c;我花了相当多时间对原先的文档&#xff0c;冗余…

HTML5之HTML基础学习笔记

列表标签 列表的应用场景 场景&#xff1a;在网页中按照行展示关联性的内容&#xff0c;如&#xff1a;新闻列表、排行榜、账单等特点&#xff1a;按照行的方式&#xff0c;整齐显示内容种类&#xff1a;无序列表、有序列表、自定义列表 这是老师PPT上的内容&#xff0c; 列表…

day10_面向对象基础

今日内容 零、 复习昨日 一、面向对象的概念 二、面向对象编程 三、内存图 零、 复习昨日 见晨考题 每日一数组题 写一个方法 用于合并两个int类型的数组 合并法则如下 {1,2,5,8,9}{1,3,0}---->{1,2,5,8,9,1,3,0} package com.qf.array;import java.util.Arrays;/*** --- 天…

基于Java+SpringBoot+Vue+uniapp前后端分离图书阅读系统设计与实现

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建、毕业项目实战、项目定制✌ 博主作品&#xff1a;《微服务实战》专栏是本人的实战经验总结&#xff0c;《S…

MySQL在Linux上的四种安装方式

目录 前言 一、仓库安装 二、本地安装 三、容器安装 四、源码安装 前言 博主的配置信息&#xff1a; Windows版本&#xff1a;Win10 VMware虚拟机版本&#xff1a;Vmware Workstation Pro 17 Linux版本&#xff1a;Red Hat Enterprise Linux 9.1 MySQL版本&#xff1a;My…

一篇文章搞懂Cookie

目录 1 什么是Cookie 2 创建Cookie 3 浏览器查看Cookie 3.1 浏览器查看Cookie的第一种方式 3.2 浏览器查看Cookie的第二种方式 4 获取Cookie 5 修改Cookie 6 Cookie编码与解码 6.1 创建带中文Cookie 6.2 读取带中文Cookie 6.3 获取中文Cookie请求效果 6.4 解决创建和…

grafana9 使用消息模板配置发送企业微信(wecom)

一、grafana9告警设置&#xff1a; 1、进入告警消息模板介面 2、grafana 消息模板设置 template name : API_msg_tpl #名字随便 {{ define "myalert" }} **警报时间:** {{ .StartsAt.Format "2006-01-02 15:04:05 " }} {{ if gt (len .Labels) 0 }}**…

毕业5年,从月薪3000到年薪40w,我掌握了那些核心技能?(建议收藏)

大家好&#xff0c;我是静静~~是一枚一线大厂的测试开发工程师很多读者私信问我&#xff0c;自己时间不短了&#xff0c;随着工作年限的不断增长&#xff0c;感觉自己的技术水平与自己的工作年限严重不符。想跳槽出去换个新环境吧&#xff0c;又感觉自己的能力达不到心仪公司的…

Python_pytorch

python_pytorch 小土堆pytotch学习视频链接 from的是一个个的包&#xff08;package) import 的是一个个的py文件(file.py) 所使用的一般是文件中的类(.class) 第一步实例化所使用的类,然后调用类中的方法&#xff08;def) Dataset 数据集处理 import os from PIL impo…

本地(window)使用alist和RaiDav网盘挂载

一、背景 百度网盘的限速可能会让你转战阿里云盘&#xff0c;但是阿里云盘的缺点在于不能分享&#xff0c;网络上的资源都是通过各类网盘来分享的&#xff0c;这样就会让你可能同时拥有不同网盘的账号。 那么我们有没有一款工具&#xff0c;可以将这些网盘资源聚合一下&#xf…

RMQ--区间最值问题(在更)

RMQ&#xff08;Range Minimum/Maximum Query&#xff09;RMQ解决的问题ST算法 O(nlogn)线段树例题数列区间最大值最敏捷的机器人天才的记忆Frequent values总结&#xff08;ST和线段树对比&#xff09;RMQ解决的问题 RMQ是一个解决多个区间最值查询的算法,即区间最值查询&…

MySQL 创建数据表

在创建数据库之后&#xff0c;接下来就要在数据库中创建数据表。所谓创建数据表&#xff0c;指的是在已经创建的数据库中建立新表。 创建数据表的过程是规定数据列的属性的过程&#xff0c;同时也是实施数据完整性&#xff08;包括实体完整性、引用完整性和域完整性&#xff09…

LwIP系列--线程通信消息结构

一、目的如果有小伙伴移植过LwIP&#xff0c;那么你肯定知道在LwIP源码中tcp/ip协议栈是作为一个单独的线程运行的&#xff0c;那么就有这样一个问题&#xff0c;我们从mac外设上收到的以太网数据包是如何交给tcp/ip线程进行处理的&#xff0c;用户发送的数据又是如何经过协议栈…

不学Python迟早会被淘汰?Python真有这么好的前景?

最近几年Python编程语言在国内引起不小的轰动&#xff0c;有超越Java之势&#xff0c;本来在美国这个编程语言就是最火的&#xff0c;应用的非常非常的广泛&#xff0c;而Python的整体语言难度来讲又比Java简单的很多。尤其是在运维的应用中非常的广泛&#xff0c;所以之前出了…

Ubuntu20.04无线网卡驱动安装

文章目录一.未安装无线网卡驱动的Ubuntu20.04联网方式二.Ubuntu20.04无线网卡驱动安装UbuntuU盘启动盘安装好Ubuntu 20.04之后&#xff0c;发现没有无线网络&#xff0c;不过有线可以用。一.未安装无线网卡驱动的Ubuntu20.04联网方式 比较简单的就是直接拉一条网线进行连接&am…

【C语言】宏定义 结构体 枚举变量的用法

目录 一、数据类型 二、C语言宏定义 三、C语言typedef重命名 四、 #define与typedef的区别 五、结构体 六、枚举变量 补充学习一点STM32的必备基础知识 一、数据类型 二、C语言宏定义 关键字&#xff1a;#define 用途&#xff1a;用一个字符串代替一个数字&#xff0c;…