【每日一题】掷骰子等于目标和的方法数

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:动态规划
  • 写在最后

Tag

【动态规划】【数组】


题目来源

1155. 掷骰子等于目标和的方法数


题目解读

你手里有 n 个一样的骰子,每个骰子都有 k 个面,分别标号 1n。给定三个整数 nktarget,返回这个 n 个骰子正面朝上的数字组成 target 的所有方案数。答案可能很大,返回对 1 e 9 + 7 1e9+7 1e9+7 取模后的值。


解题思路

方法一:动态规划

我们可以使用动态来解决本题。

状态

f[i][j] 表示使用 i 个骰子且数字和为 j 的方案数。

转移关系

我们可以枚举最后一个骰子的数字,数字的范围在 [1, k],使用 i 个骰子组成的数字和为 j 的方案数为:

f [ i , j ] = ∑ x = 1 k f [ i − 1 ] [ j − k ] f\left[ i,j \right] =\sum_{x=1}^k{f\left[ i-1 \right] \left[ j-k \right]} f[i,j]=x=1kf[i1][jk]

base case

f[0][0] = 1,计即我们还没有掷骰子,数字之和为 0 时的方案数。

最终返回

最终返回 f[n][target],表示使用 n 个骰子正面朝上的数字组成 target 的所有方案数

实现代码

class Solution {
public:int numRollsToTarget(int n, int k, int target) {if (target < n || target > n * k) {return 0;}const int MOD = 1e9 + 7;vector<vector<int>> f(n+1, vector<int>(target+1));f[0][0] = 1;for (int i = 1; i <= n; ++i) {for (int j = 0; j <= target; ++j) {for (int x = 1; x <= k; ++x) {if (j - x >= 0) {f[i][j] = (f[i][j] + f[i-1][j-x]) % MOD;}}}}return f[n][target];}
};

优化

注意观察状态转移方程,f[i][j] 只会从 f[i-1, ...] 转移过来,因此只需要存储第 i 行和第 i-1 行的值,使用两个一维数组代替二维数组进行转态转移。

class Solution {
public:int numRollsToTarget(int n, int k, int target) {if (target < n || target > n * k) {return 0;}const int MOD = 1e9 + 7;vector<int> f(target + 1);f[0] = 1;for (int i = 1; i <= n; ++i) {vector<int> g(target + 1);for (int j = 0; j <= target; ++j) {for (int x = 1; x <= k; ++x) {if (j - x >= 0) {g[j] = (g[j] + f[j-x]) % MOD;}}}f = g;}return f[target];}
};

复杂度分析

时间复杂度: O ( n ⋅ k ⋅ t a r g e t ) O(n \cdot k \cdot target) O(nktarget)

空间复杂度: O ( n ⋅ t r a g e t ) O(n \cdot traget) O(ntraget),优化后的空间复杂度为 O ( t a r g e t ) O(target) O(target)


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

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

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

相关文章

【Linux】操作系统以及虚拟机的安装与配置

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Linux的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.操作系统的介绍 二.VMWare虚拟机的安装…

游戏研发的解决方案有哪些?

游戏研发的解决方案可以根据不同的需求和情境而有所不同&#xff0c;以下是一些常见的游戏研发解决方案&#xff1a; 游戏引擎&#xff1a; 游戏引擎是游戏研发的基础&#xff0c;它提供了开发游戏所需的核心功能&#xff0c;如图形渲染、物理引擎、音效管理、动画等。一些流行…

前端搜索过滤表格数据

一&#xff0c;纯前端过滤表格数据 <el-input v-model"searchName" placeholder"请搜索工况名" blur"searchCondition" style"margin-left:20px ;"> </el-input><el-input v-model"searchName1" placeholder…

电大搜题:开启智慧学习新时代

近年来&#xff0c;随着社会的发展和科技的迅猛进步&#xff0c;远程教育成为了广大学子继续教育的新选择。而在重庆&#xff0c;一所备受关注的远程教育学府——重庆开放大学&#xff0c;以其开放的教育理念和多元的学习方式&#xff0c;为广大学生提供了便捷而高效的学习平台…

Python与CAD系列基础篇(十)图形复制、移动、删除

目录 0 简述1 图形复制与移动2 图形删除0 简述 本篇详细介绍使用①通过pyautocad连接AutoCAD进行处理②通过ezdxf处理dxf格式文件进行图形复制、移动、删除的方法。 1 图形复制与移动 pyautocad方式 from pyautocad import Autocad, APointdef draw_circle_copied():# 连接到…

49.Redis缓存设计与性能优化

缓存与数据库双写不一致小概率事件 //线程1 写数据库stock 5 ---------------》更新缓存 //线程2 写数据库stock 4 -----》更新缓存 //线程1 ------》写数据库stock 10 -----》删除缓存 //线程2 ---------------------------------------------------------------------…

子集生成算法:给定一个集合,枚举所有可能的子集

给定一个集合&#xff0c;枚举所有可能的子集。 &#xff08;为简单起见&#xff0c;本文讨论的集合中没有重复元素&#xff09; 1、方法一&#xff1a;增量构造法 第一种思路是一次选出一个元素放到集合中&#xff0c;程序如下&#xff1a; void print_subset(int n, int …

36基于matlab的对分解层数和惩罚因子进行优化

基于matlab的对分解层数和惩罚因子进行优化。蚁狮优化算法优化VMD,算术优化算法优化VMD&#xff0c;遗传优化算法优化VMD&#xff0c;灰狼优化算法优化VMD&#xff0c;海洋捕食者优化算法优化VMD&#xff0c;粒子群优化VMD&#xff0c;麻雀优化算法优化VMD&#xff0c;鲸鱼优化…

我会在以下情况用到GPT

ChatGPT可以在各种情况下派上用场&#xff0c;包括但不限于以下情况&#xff1a; 获取信息&#xff1a;你可以使用ChatGPT来获取关于各种主题的信息&#xff0c;例如历史事件、科学知识、文化背景等。ChatGPT可以用作一个知识库&#xff0c;回答你的问题。 学习新知识&#xf…

C语言 每日一题 PTA 10.27 day5

1.高速公路超速处罚 按照规定&#xff0c;在高速公路上行使的机动车&#xff0c;达到或超出本车道限速的10 % 则处200元罚款&#xff1b; 若达到或超出50 % &#xff0c;就要吊销驾驶证。请编写程序根据车速和限速自动判别对该机动车的处理。 输入格式 : 输入在一行中给出2个正…

win10 + VS2017 编译libjpeg(jpeg-9b)

需要用到的文件&#xff1a; jpeg-9b.zip win32.mak 下载链接链接&#xff1a;https://pan.baidu.com/s/1Z0fwbi74-ZSMjSej-0dV2A 提取码&#xff1a;huhu 步骤1&#xff1a;下载并解压jpeg-9b。 这里把jpeg-9b解压到文件夹"D:\build-libs\jpeg\build\jpeg-9b" …

fabric.js介绍

fabric.js是可以简化canvas编写的js库&#xff0c;提供canvas缺少的对象模型&#xff0c;包含动画、数据序列化和反序列化的等高级功能的js库&#xff0c;开源项目&#xff0c;在GitHub有很多人贡献。 官网&#xff1a;Fabric.js Javascript Canvas Library (fabricjs.com) 文档…

django报错--Not Found The requested URL was not found on the server.

这个问题通常是由于服务器配置或代码错误导致的。以下是解决这个问题的一些建议和步骤&#xff1a; 首先&#xff0c;请确保你的URL拼写正确。确认URL中的路径和文件名都是正确的&#xff0c;并且没有任何拼写错误。如果你是从浏览器中复制粘贴URL&#xff0c;请确保没有任何额…

CVE-2022-22965 Spring Framework远程命令执行

0x01 影响版本 Spring Framework < 5.3.18 Spring Framework < 5.2.20 JDK>9 0x02 复现环境 vulhub/spring/cve-2022-22965 0x03 漏洞复现 首先docker-compose up -d开启靶场 输入payload <%if("j".equals(request.getParameter("pwd")…

LSM树原理详解

LSM树(Log-Structured-Merge-Tree)的名字往往会给初识者一个错误的印象&#xff0c;事实上&#xff0c;LSM树并不像B树、红黑树一样是一颗严格的树状数据结构&#xff0c;它其实是一种存储结构&#xff0c;目前HBase,LevelDB,RocksDB这些NoSQL存储都是采用的LSM树。 LSM树的核…

C++八股文面经

1.介绍一下你对面向对象的理解&#xff0c; 面向对象编程&#xff08;Object-Oriented Programming&#xff0c;简称OOP&#xff09;是一种编程范式&#xff0c;它将数据和操作数据的方法组合成一个对象&#xff0c;以此来描述现实世界中的事物和概念。在面向对象编程中&#…

如何在用pip配置文件设置HTTP爬虫IP

首先&#xff0c;定义问题&#xff1a;在 Pip 中设置HTTP爬虫IP服务器&#xff0c;以便在网络上进行访问和下载。 亲身经验&#xff1a;我曾经遇到过类似问题&#xff0c;通过设置HTTP爬虫IP服务器成功解决了网络访问问题。 数据和引证&#xff1a;根据 pip 官方文档&#xff…

小程序如何设置自取规则

​在小程序中&#xff0c;自取规则是指当客户下单时选择无需配送的情况下&#xff0c;如何设置相关的计费方式、指定时段费用、免费金额、预定时间和起取金额。下面将详细介绍如何设置这些规则&#xff0c;以便更好地满足客户的需求。 在小程序管理员后台->配送设置->自…

0基础学习PyFlink——用户自定义函数之UDTAF

大纲 UDTAFTableAggregateFunction的实现累加器定义创建累加 返回类型计算 完整代码 在前面几篇文章中&#xff0c;我们分别介绍了UDF、UDTF和UDAF这三种用户自定义函数。本节我们将介绍最后一种函数&#xff1a;UDTAF——用户自定义表值聚合函数。 UDTAF UDTAF函数即具备了…

什么是腾讯云轻量应用服务器?轻量性能和价格表分享

腾讯云轻量应用服务器怎么样&#xff1f;什么是腾讯云轻量应用服务器&#xff1f;轻量应用服务器性能怎么样&#xff1f;腾讯云轻量应用服务器如何收费&#xff1f;轻量2核2G3M云服务器88元一年、3年轻量2核2G4M带宽优惠价366.6元、轻量2核4G5M服务器166.6元一年、3年轻量2核4G…