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

LeetCode·每日一题·1223.掷骰子模拟·记忆化搜索

作者:小迅

链接:https://leetcode.cn/problems/dice-roll-simulation/solutions/2103471/ji-yi-hua-sou-suo-zhu-shi-chao-ji-xiang-xlfcs/

来源:力扣(LeetCode)

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

题目

示例

思路

题意 -> 给定一个字符串规定相同类型的骰子连续出现的最大值,返回投掷 n 次后能出现的 骰数 的不同序列个数

题目说是 骰子模拟,那么直接按照题目意思进行模拟呢?

想一想,掷了一个骰子(设值为 x)后,会发生什么情况?

既然题目有 rollMax 的限制,那么分类讨论:

  • 如果和上一个骰子值相同,那么 x 的连续出现次数不能超过 rollMax[x];

  • 如果不同,那么可以重置连续出现次数为 1。

关键词提取:「上一个骰子值」「连续出现次数」

那么在回溯中就需要知道(为了方便后面转成递推,定义成剩余):

  • 剩余掷骰子的次数,用 i 表示;

  • 上一个骰子值,用 last 表示;

  • last 的剩余连续出现次数,用 left 表示。

这样就确定了递归的参数,递归的返回值就是骰子序列个数。

要递归到哪里去呢?我们可以用回溯中的经典技巧「枚举选哪个」:

  • 如果选的骰子值和上一个相同,且 left>0,那么递归到 (i−1,last,left−1);

  • 如果不同,设为 j,那么递归到 (i−1,j,rollMax[j]−1)。

枚举 j=0,1,2,3,4,5,把递归后的结果相加,就是当前 (i,last,left) 的答案。

递归到 n=0 时结束,返回 1,表示找到了一个合法骰子序列

整个回溯过程是有大量重复递归调用的。由于递归函数没有副作用,无论多少次调用 dfs(i,last,left) 算出来的结果都是一样的,因此可以用记忆化搜索来优化:

  • 如果一个状态(递归入参)是第一次遇到,那么可以在返回前,把状态及其结果记到一个 cache 数组(或者哈希表)中;

  • 如果一个状态不是第一次遇到,那么直接返回 cache 中保存的结果。

cache[n][x][y] - n 表示 当前剩余投掷次数, x 表示上一次投掷骰子值, y表示 上一次投掷骰子值 剩余的出现次数;

为啥可以到达记忆化效果,因为当前投掷结果的有效性只和上一次的投掷结果相关,「先掷 1 后掷 3」和「先掷 2 后掷 3」,都会递归到 dfs(n−2,3,rollMax[3]−1)。

如何转动态规划 :

  • 可以去掉递归中的「递」,只保留「归」的部分,即自底向上计算。

做法:

  • dfs 改成 f 数组;

  • 递归改成循环(每个参数都对应一层循环);

  • 递归边界改成 f 数组的初始值。

代码注释超级详细

代码

const long MOD = 1e9 + 7;int dfs(int i, int last, int *rollMax, int left, int (*cache)[6][15])
{if (i == 0) return 1;int *c = (int *)&(cache[i][last][left]);if (*c >= 0) return *c;//如果之前算过就不需要重新计算long res = 0;for (int j = 0; j < 6; ++j)if (j != last) res += dfs(i - 1, j, rollMax, rollMax[j] - 1, cache);else if (left) res += dfs(i - 1, j, rollMax, left - 1, cache);return *c = res % MOD;
}int dieSimulator(int n, int* rollMax, int rollMaxSize){int cache[n][6][15];//记忆化数组memset(cache, -1, sizeof(cache)); // -1 表示没有访问过long ans = 0;for (int j = 0; j < 6; ++j)//枚举初始状态0-6ans += dfs(n - 1, j, rollMax, rollMax[j] - 1, cache);return ans % MOD;
}作者:小迅
链接:https://leetcode.cn/problems/dice-roll-simulation/solutions/2103471/ji-yi-hua-sou-suo-zhu-shi-chao-ji-xiang-xlfcs/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {const long MOD = 1e9 + 7;
public:int dieSimulator(int n, vector<int> &rollMax) {int m = rollMax.size(), f[n][m][15];for (int j = 0; j < m; ++j)for (int k = 0; k < rollMax[j]; ++k)f[0][j][k] = 1;for (int i = 1; i < n; ++i)for (int last = 0; last < m; ++last)for (int left = 0; left < rollMax[last]; ++left) {long res = 0;for (int j = 0; j < m; ++j)if (j != last) res += f[i - 1][j][rollMax[j] - 1];else if (left) res += f[i - 1][j][left - 1];f[i][last][left] = res % MOD;}long ans = 0;for (int j = 0; j < m; ++j)ans += f[n - 1][j][rollMax[j] - 1];return ans % MOD;}
};

相关文章:

LeetCode·每日一题·1223.掷骰子模拟·记忆化搜索

作者&#xff1a;小迅链接&#xff1a;https://leetcode.cn/problems/dice-roll-simulation/solutions/2103471/ji-yi-hua-sou-suo-zhu-shi-chao-ji-xiang-xlfcs/来源&#xff1a;力扣&#xff08;LeetCode&#xff09;著作权归作者所有。商业转载请联系作者获得授权&#xff0…...

【GPLT 二阶题目集】L2-043 龙龙送外卖

参考地址&#xff1a;AcWing 4474. 龙龙送外卖&#xff08;杂题选讲&#xff09; 作者&#xff1a;yxc 感谢y总&#xff01; 龙龙是“饱了呀”外卖软件的注册骑手&#xff0c;负责送帕特小区的外卖。帕特小区的构造非常特别&#xff0c;都是双向道路且没有构成环 —— 你可以…...

Maven:基础知识

Maven概念图生命周期目录工程创建测试常用命令COMPILATION ERROR : 不再支持目标选项 5。请使用 7 或更高版本。问题解决pom.xml文件properties配置示例scope配置详解概念图 依赖管理构建项目Maven 的底层核心实现项目的构建和管理必须通过插件完成&#xff0c;但插件本身并不包…...

Web 框架 Flask 快速入门(一)flask基础与模板

前言 课程地址&#xff1a;Python Web 框架 Flask 快速入门 文章目录前言&#x1f334; Flask基础和模板&#x1f337; 一个简单的flask程序&#x1f33c; 模板的使用&#x1f334; Flask基础和模板 1、web框架的作用 避免重复造轮子&#xff0c;app程序不必关心于服务器的沟…...

1CN/Jaccard/PA/AA/RA/Katz/PageRank/SimRank

common neighbors&#xff08;CN&#xff09; 公共邻居的数量。 Jaccard 用于比较有限样本集之间的相似性与差异性。Jaccard系数值越大&#xff0c;样本相似度越高。 preferential attachment&#xff08;PA&#xff09; 节点倾向于连接到节点度较高的节点上&#xff0c;&…...

YOLOv5-Backbone模块实现

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章地址&#xff1a; 365天深度学习训练营-第P8周&#xff1a;YOLOv5-Backbone模块实现&#x1f356; 作者&#xff1a;K同学啊一、前期准备1.设置GPUimport torch from torch impor…...

【C语言】程序环境和预处理

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;别人可以拷贝我的模式&#xff0c;但不能拷贝我不断往前的激情 &#x1f6f8;C语言专栏&#xff1a;https://blog.csdn.net/vhhhbb/category_12174730.html 小苏希望大家能从这篇文章中收获到许…...

9.关系查询处理和查询优化

其他章节索引 梳理 名词解释 代数优化&#xff1a;是指关系代数表达式的优化&#xff0c;也即按照一定规则&#xff0c;通过对关系代数表达式进行等价变换&#xff0c;改变代数表达式中操作的次序和组合&#xff0c;使查询更高效物理优化&#xff1a;是指存取路径和底层操作算…...

计算机组成原理(三)

5.掌握定点数的表示和应用&#xff08;主要是无符号数和有符号数的表示、机器数的定点表示、数的机器码表示&#xff09;&#xff1b; 定点数&#xff1a;小数点位置固定不变。   定点小数&#xff1a;小数点固定在数值位与符号位之间&#xff1b;   定点整数&#xff1a;小…...

C. Least Prefix Sum codeforces每日一题

&#x1f680;前言 &#x1f680; 大家好啊&#xff0c;这里是幸麟 &#x1f9e9; 一名普通的大学牲&#xff0c;最近在学习算法 &#x1f9e9;每日一题的话难度的话是根据博主水平来找的 &#x1f9e9;所以可能难度比较低&#xff0c;以后会慢慢提高难度的 &#x1f9e9;此题标…...

ASEMI三相整流模块MDS100-16图片,MDS100-16尺寸

编辑-Z ASEMI三相整流模块MDS100-16参数&#xff1a; 型号&#xff1a;MDS100-16 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;1600V 最大RMS电桥输入电压&#xff08;VRMS&#xff09;&#xff1a;1700V 最大平均正向整流输出电流&#xff08;IF&#…...

【第37天】斐波那契数列与爬楼梯 | 迭代的鼻祖,递推与记忆化

本文已收录于专栏&#x1f338;《Java入门一百例》&#x1f338;学习指引序、专栏前言一、递推与记忆化二、【例题1】1、题目描述2、解题思路3、模板代码4、代码解析5.原题链接三、【例题1】1、题目描述2.解题思路3、模板代码4、代码解析5、原题链接三、推荐专栏四、课后习题序…...

Map集合

Map集合 Map接口的简介 Map用于保存具有映射关系的数据&#xff0c;Map里保存着两组数据&#xff1a;key和value&#xff0c;它们都可以使任何引用类型的数据&#xff0c;但key不能重复。所以通过指定的key就可以取出对应的value。 Map 没有继承 Collection 接口&#xff0c…...

PyQt5编程扩展 3.2 资源文件的使用

目录 本例运行效果&#xff1a; 设计Qt窗体 建立项目 放一个Group Box 放三个Label 放一个Horizontal Slider 放两个Line Edit 层次结构 布局 放一个Group Box 放两个Label 放两个Line Edit 放一个Push Button 层次结构 布局 放一个frame 层次结构 布局 窗体…...

Linux系统之文件共享目录设置方法

Linux系统之文件共享目录设置方法一、本次实践目的二、检查本地系统环境1.检查系统版本2.检查系统内核三、创建相关用户及用户组1.创建共享目录2.创建测试用户账号3.创建用户组4.设置用户的属组5.查看admin和IT用户组成员6.查看所有用户信息四、共享目录权限设置1.设置/data/so…...

上海亚商投顾:三大指数均涨超1% 芯片板块集体大涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪三大指数今日低开高走&#xff0c;午后集体涨超1%&#xff0c;创业板指盘中涨超1.7%。芯片板块集体大涨&#xff0c;…...

Harbor私有仓库部署与管理

目录 前言 一、Harbor概述 二、Harbor 的特性 三、Harbor的构成 四、Harbor构建Docker私有仓库 1、环境配置 2、案例需求 3、部署Harbor服务 3.1、部署docker compose服务 3.2 下载或上传Harbor安装程序 3.3、启动Harbor 3.4、查看Harbor启动镜像 4、物理机访问se…...

互联网架构之 “高可用” 详解

一、什么是高可用 高可用HA&#xff08;High Availability&#xff09;是分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;通过设计减少系统不能提供服务的时间。 假设系统一直能够提供服务&#xff0c;我们说系统的可用性是100%。 如果系统每运行…...

分布式高级篇4 —— 商城业务(2)

一、订单服务1、订单基本概念2、订单基本构成3、订单状态4、订单流程5、配置拦截器拦截订单请求6、订单确认页模型抽取7、订单确认页vo封装8、Feign 远程调用请求头丢失问题\*\*\*\*\* 惨痛教训9、Feign 异步调用请求头丢失问题10、查看库存状态11、模拟计算运费12、接口幂等性…...

二分查找基本原理

二分查找基本原理1.二分查找1.1 基本概念1.2 二分查找查找步骤1.2.1 中间索引不能整除&#xff0c;取整数作为中间索引1.2.2 索引不能整除&#xff0c;整数1作为中间索引1.3 二分查找大O记法表示2. 二分查找代码实现1.二分查找 1.1 基本概念 二分法(折半查找&#xff09;是一…...

visionOS开发实战:从示例项目到空间应用构建全指南

1. 从零到一&#xff1a;如何高效利用 visionOS 示例项目库如果你和我一样&#xff0c;是个对 Apple Vision Pro 和 visionOS 开发充满好奇的开发者&#xff0c;那么你肯定经历过这样的阶段&#xff1a;面对一个全新的平台&#xff0c;既兴奋于其无限的可能性&#xff0c;又对如…...

环境配置与基础教程:保姆级教程:VS Code DevContainer 一键构建可复现的 YOLO 训练开发容器

摘要 你是否还在为YOLO训练环境的搭建而焦头烂额?CUDA版本不匹配、Python依赖冲突、团队协作时“在我机器上能跑”的经典难题——这些问题浪费了无数开发者的宝贵时间。本文将带你通过VS Code DevContainer技术,一键构建完全可复现的YOLO训练开发容器,彻底告别环境配置噩梦…...

精读双模态检测论文二十六|DefDeN(兰州大学)创新点拉满!门控融合+可变形去噪+对比学习,LiDAR-Camera 3D检测暴力涨点!!!

&#x1f525; 本文定位&#xff1a;CSDN 原创干货 | 兰州大学/卧龙岗大学 LiDAR-Camera 3D目标检测 SOTA 方案 &#x1f3af; 核心收益&#xff1a;一次性解决注意力融合三大痛点——收敛慢、计算量大、误检率高&#xff01;基于门控多模态融合单元&#xff08;GMFU&#xff0…...

学Simulink——基于储能系统参与电网一次调频的下垂控制仿真示例

目录 手把手教你学Simulink——基于储能系统参与电网一次调频的下垂控制仿真示例 一、 引言&#xff1a;当“新能源浪潮”遇见“频率崩塌”——储能如何化身电网的“速效救心丸”&#xff1f; 二、 问题本质&#xff1a;一次调频的“核心挑战”与“协同逻辑” 1. 核心挑战 …...

Fish-Speech开源语音合成:从VITS原理到中文TTS实战部署

1. 项目概述&#xff1a;当AI遇见声音&#xff0c;一个开源的语音合成新选择最近在语音合成这个圈子里&#xff0c;一个名为 Fish-Speech 的项目开始引起不少开发者和研究者的注意。简单来说&#xff0c;Fish-Speech 是一个开源的、基于深度学习的文本到语音&#xff08;TTS&am…...

基于LLaMA-2的中文大模型实战:从增量预训练到部署应用

1. 项目概述&#xff1a;当大语言模型说起了中文如果你在2023年关注过开源大语言模型&#xff08;LLM&#xff09;的进展&#xff0c;那么“Chinese-LLaMA-Alpaca”这个名字你一定不陌生。它几乎是当时中文社区里&#xff0c;让Meta开源的LLaMA模型“学会”流利中文对话的代名词…...

《如果你还愿意等》的搜索理由:等待场景怎样被记住

从内容传播角度看&#xff0c;《如果你还愿意等》的优势在于语气。它不是命令&#xff0c;也不是苦情控诉&#xff0c;而是把等待放成一个“如果”&#xff1a;有余地&#xff0c;也有边界。这个标题能自然带出使用场景&#xff1a;未读消息、夜车灯光、异地关系、还没完全离开…...

CANN/ops-math Signbit算子文档

aclnnSignbit 【免费下载链接】ops-math 本项目是CANN提供的数学类基础计算算子库&#xff0c;实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-math &#x1f4c4; 查看源码 产品支持情况 产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系…...

SAP顾问实战笔记:手把手配置OBYC,搞定采购收货到发票校验的自动记账

SAP财务自动化实战&#xff1a;从采购收货到发票校验的OBYC全链路配置指南 当财务部门每月需要处理上千笔采购业务时&#xff0c;手工记账不仅效率低下&#xff0c;还容易出错。SAP系统中的OBYC配置正是解决这一痛点的关键——它能实现从采购收货到发票校验的全自动会计凭证生成…...

轻量级Web代理moltron:架构解析与生产级部署实战

1. 项目概述&#xff1a;一个轻量级、高性能的Web代理工具在开发和运维的日常工作中&#xff0c;我们经常需要处理不同网络环境下的服务访问问题。比如&#xff0c;本地开发需要调试一个部署在内网测试环境的API&#xff0c;或者需要安全地访问某些仅限特定网络访问的资源。传统…...