[leetcode 周赛 149] 1155 掷骰子的N种方法

2023-11-11

1155 Number of Dice Rolls With Target Sum 掷骰子的N种方法

描述

这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, ..., f
我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和
如果需要掷出的总点数为 target,请你计算出有多少种不同的组合情况(所有的组合情况总共有f^d 种),模10^9 + 7后返回。

  • 示例 1:

    输入:d = 1, f = 6, target = 3
    输出:1

  • 示例 2:

    输入:d = 2, f = 6, target = 7
    输出:6

  • 示例 3:

    输入:d = 2, f = 5, target = 10
    输出:1

  • 示例 4:

    输入:d = 1, f = 2, target = 3
    输出:0

  • 示例 5:

    输入:d = 30, f = 30, target = 500
    输出:222616187

  • 提示:
    1 <= d, f <= 30
    1 <= target <= 1000

思路

这明显是个动态规划问题

  • 规律公式
    1640888-20190816231150472-1764181522.png

d为骰子数, f为骰子面数, target为目标值, k表示当前第d个骰子掷出的数

  • 初始状态
    1640888-20190816231159361-182829478.png

需要投掷的目标数在单个骰子的范围内 返回1, 否则返回0

代码实现

1640888-20190816231632875-2071171256.png

递归实现

class Solution {
    static int MOD = (int)(1e9+7);
    
    public int numRollsToTarget(int d, int f, int target) {
        if (target < d | target > d*f) return 0;
        
        int[][] dp = new int[d+1][target+1];
        // 初始化 全-1 表示未被处理
        for (int[] dpi : dp) Arrays.fill(dpi, -1);
        
        return helper(d, f, target, dp);
    }
    
    int helper(int d, int f, int target, int[][] dp) {
        // target 超出骰子的投掷范围
        if (target < d | target > d*f) return 0;
        // 如果已经处理过 使用之前记录数据
        if (dp[d][target] != -1) return dp[d][target];
        // 当单个骰子时
        if (d==1) {
            if (target <= f && target > 0) return dp[d][target]=1;
            else return dp[d][target]=0;
        }
        // 数据没有被记录 骰子数大于等于2
        int ans = 0;
        // 对当前骰子投掷出的每个面数都进行处理
        for (int cur=1; cur <= f; cur++) {
            ans = (ans + helper(d-1, f, target-cur, dp))%MOD;
        }
        // 对数据进行记录
        return dp[d][target]=ans;
    }
}

1640888-20190816231221380-1056073222.png

非递归实现

class Solution {
    // 取模数 1e9 + 7
    final static int MOD = 1000000007;
    public int numRollsToTarget(int d, int f, int target) {
        if (target < d | target > d*f) return 0;
        
        // dp 表示当骰子为i(1~d)时j(1~target)的组合数
        // 其实长度可以是2 因为只使用上一轮的数据
        int[][] dp = new int[d+1][target+1];
        
        // 初始为1
        dp[0][0] = 1;
        // 从有1个骰子开始 1~d
        for (int i = 1; i <= d; i++) {
            // 当前骰子投掷数 1~f
            for (int cur = 1; cur <= f; cur++) {
                // 加上上一轮没有投掷cur时prev的组合数
                for (int prev = 0; prev+cur <= target; prev++) {
                    dp[i][prev+cur] = (dp[i][prev+cur] + dp[i-1][prev])%MOD;
                }
            }
        }
        
        return dp[d][target];
    }
}

转载于:https://www.cnblogs.com/slowbirdoflsh/p/11366818.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[leetcode 周赛 149] 1155 掷骰子的N种方法 的相关文章

  • C语言/C++实现栈操作

    一 栈的概念 栈是一种常用的数据结构 它遵循先入后出 Last In First Out LIFO 的原则 栈的操作只在栈的一端进行 该端被称为栈顶 而另一端称为栈底 栈的基本操作包括压栈 入栈 push 和弹栈 出栈 pop 分别用于将元
  • 《Linux From Scratch》第三部分:构建LFS系统 第六章:安装基本的系统软件- 6.29. Coreutils-8.23...

    Coreutils 软件包包含用于显示和设置基本系统特性的工具 大概编译时间 2 5 SBU 需要磁盘空间 193 MB 6 29 1 安装 Coreutils POSIX 要求 Coreutils 中的程序即使在多字节语言环境也能正确识别
  • LeetCode83: 删除排序链表中的重复元素

    给定一个已排序的链表的头 head 删除所有重复的元素 使每个元素只出现一次 返回 已排序的链表 示例 1 输入 head 1 1 2 输出 1 2 示例 2 输入 head 1 1 2 3 3 输出 1 2 3 提示 链表中节点数目在范围
  • 数据结构之链表与线性表

    数据结构之链表与线性表 线性表 顺序线性表 顺序表 顺序线性表 使用数组实现 一组地址连续的存储单元 数组大小有两种方式指定 一是静态分配 二是动态扩展 优点 随机访问特性 查找O 1 时间 存储密度高 逻辑上相邻的元素 物理上也相邻 缺点
  • Hash table and application in java

    查找的效率取决于在查找是比较的次数 次数越少效率越高 反之越低 最理想的情况是无需比较 一次存取便能找到所查找的记录 根据对应关系f找到给定值K的像f K hash function 应运而生 由此思想建的表称为hash table 集合h
  • 用 Java 实现的八种常用排序算法

    八种排序算法可以按照如图分类 前置知识 1 算法稳定性 在一个序列中 能保证两个相等的数 经过排序之后 其在序列的前后位置顺序不变 A1 A2 排序前 A1 在 A2 前面 排序后 A1 还在 A2 前面 2 时间复杂度 时间复杂度是用于衡
  • 递归算法中的时间复杂度分析

    对于一种算法的时间复杂度分析还是特别重要的 在一些非递归算法中 我们仅仅看运算次数最多的那一行代码可能执行多少次就可以 实际就是看在循环中变量的变化 但是对于递归算法中该怎么分析呢 下面介绍几种递归函数中的算法时间复杂度分析的方法 0 递推
  • Hash映射理解

    先说数组 数组优点之一 能通过索引很快定位到值 hashmap 就是利用了数组这个优点 对比 线性映射 定义一个数组 数组的元素是结构体 结构体包括 一对键 值 伪代码表示 a 0 struct Bill 5 a 1 struct KK 6
  • 亚利桑那州立大学周纵苇:研习 U-Net ——现有的分割网络创新

    雷锋网AI研习社按 经典的 Encoder Decoder 结构在目标分割问题中展现出了举足轻重的作用 然而这样一个相对固定的框架使得模型在感受野大小和边界分割精度两方面很难达到兼顾 本次公开课 讲者以 U Net 为案例分析 总结现有的分
  • 如何根据链表节点数据大小对链表节点进行排序

    对链表排序有两种方法 1 比较了两个节点的大小后 对指针进行改变 从而交换节点的顺序 2 比较了两个节点的大小后 只交换数据域 而不改变指针 从而交换节点的顺序 第二种办法比较简单 本文主要对第二种方法进行讲解 链表节点排序算法 采用 冒泡
  • 图 - Java实现无向带权图的邻接矩阵表示法

    图 Java实现无向带权图的邻接矩阵表示法 1 图 1 1 图的介绍 图 Graph 是一种复杂的非线性表结构 图中的元素我们就叫做顶点 vertex 图中的一个顶点可以与任意其他顶点建立连接关系 我们把这种建立的关系叫做边 edge 跟顶
  • Unique Binary Search Trees -- LeetCode

    原题链接 http oj leetcode com problems unique binary search trees 这道题要求可行的二叉查找树的数量 其实二叉查找树可以任意取根 只要满足中序遍历有序的要求就可以 从处理子问题的角度来
  • 堆栈01--用两个栈实现队列

    堆栈01 用两个栈实现队列 jz05 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 用两个栈来实现一个队列 完成队列的Push和Pop操作 队列中的元素为int类型 测试用例 队列先进先出 输入 1 2 输出 1 2 解析
  • 算法学习——贪心算法之币种统计

    算法描述 币种统计 单位给每一位员工发工资 精确到元 为了保证不临时换零钱 使得每个员工取款的张数最少 在取工资前统计所有员工所需要的各种票面的张数 约定票种为100 50 20 10 5 2 1元 并验证币种统计是否正确 算法思路 算法描
  • 时间复杂度+常见复杂度解释

    前言 算法的效率 虽然计算机能快速的完成运算处理 但实际上 它也需要根据输入数据的大小和算法效率来消耗一定的处理器资源 要想编写出能高效运行的程序 我们就需要考虑到算法的效率 算法的效率主要由以下两个复杂度来评估 时间复杂度 评估执行程序所
  • 查找数组中第二大的数

    快速找出一个数组中的最大数 第二大数 思路 如果当 前元素大于最大数 max 则让第二大数等于原来的最大数 max 再把当前元素的值赋给 max 如果当前的元素大于等于第二大数secondMax的值而小于最大数max的值 则要把当前元素的值
  • 插入排序超详解释,一看就懂

    目录 一 插入排序的相关概念 1 基本思想 2 基本操作 有序插入 二 插入排序的种类 三 直接插入排序 1 直接插入排序的过程 顺序查找法查找插入位置 2 使用 哨兵 直接插入排序 四 直接插入排序算法描述 五 折半插入排序 1 查找插入
  • 基数排序代码实现

    详情请看排序总结 传送门 https blog csdn net m0 52711790 article details 121914543 基数排序的知识点我就不贴出来 相信都能搜到对应概念解释 下面就直接上代码 代码解释其实也很清晰了
  • 雪糕的最大数量 排序+贪心

    雪糕的最大数量 雪糕的最大数量 题目描述 样例 数据范围 思路 代码 题目描述 夏日炎炎 小男孩 Tony 想买一些雪糕消消暑 商店中新到 n 支雪糕 用长度为 n 的数组 costs 表示雪糕的定价 其中 costs i 表示第 i 支雪
  • 按照层次遍历结果打印完全二叉树

    按照层次遍历结果打印完全二叉树 按照推论结果 l 层首个节点位置 2 h l 1 l 层节点间距 2 h l 1 1 编码实现 public static

随机推荐

  • m2增长率曲线_中国m2历年数据曲线图_中国m2历年数据

    2012年5月经济数据 搜狐财经 580x400 39KB JPEG 李彦宏 有图有真相 移动互联网时代真的结束了 693x390 130KB PNG 图1 全国主要城市分用途地价环比增长率曲线图 540x248 36KB JPEG 美元强
  • 八大排序算法-基数排序

    基数排序 radix sort 定义 属于 分配式排序 distribution sort 又称 桶子法 bucket sort 或bin sort 顾名思义 它是透过键值的部份资讯 将要排序的元素分配至某些 桶 中 藉以达到排序的作用 分
  • JSP的初次使用

    什么是jsp JSP这三个字母是Java Server Pages的缩写 见名知意java的服务器页面 来段代码 h1 这是一个简单的JSP页面 h1 p style font size 36 color blue 1到100的连续 p
  • 处理高并发、大数据存储的网站技术架构

    本文转载自 https zhuanlan zhihu com p 24669514 大型网站技术架构剖析 高并发 大流量 40亿 PV page view 3 5亿 IP 高可用 高可用MySQL 7 24小时不间断运行 海量数据 用户分布
  • 生产环境诊断利器 WinDbg 帮你快速分析异常情况 Dump 文件

    一 简介 生产环境偶尔会出现一些异常问题 WinDbg 或 GDB 就是解决此类问题的利器 调试工具 WinDbg 如同医生的听诊器 是系统生病时做问题诊断的逆向分析工具 Dump 文件类似于飞机的黑匣子 记录着生产环境程序运行的状态 本文
  • 王道快速排序和归并排序的完整代码

    这是快排的代码要作为模板背下来 include
  • 唐诗

    作者 楚予微茫 链接 https zhuanlan zhihu com p 79798355 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 送杜少府之任蜀州 王勃 城阙辅三秦 风烟望五津 与君离别意 同是宦
  • Android---ImageSpan + SpannableStringBuilder 图文混排解决表情文字高度不一致排版错乱问题(设置padding 行间距依然生效)

    文章目录 前言 一 继承ImageSpan重写绘制方法 二 实践 前言 android图文混排的最常见实现方案就是使用SpannableStringBuilder 比如我们要实现聊天框输入表情的功能就需要用到其实现 但是当我们的icon图标
  • Java多重循环

    一 多重循环的理解 1 多重循环指一个循环语句的循环体中再包含循环语句 又称嵌套循环 2 循环语句内可以嵌套多层循环 3 不同的循环语句可以相互嵌套 语法格式 while 循环条件1 循环语句1 while 循环条件2 循环语句2 do 循
  • 分享人工智能方向优质技术博客

    Machine learning Blogs 想要阅读更多关于人工智能技术博客 请关注微信公众号 人工智能大讲堂 专注人工智能底层数学原理和应用 专栏包括线性代数 概率统计 机器学习 深度学习 线性代数博客汇总 线性代数博客合集 线性代数本
  • 激光雷达Velodyne VLP16在ROS下的使用

    Velodyne VLP16在ROS下的使用 前置条件 Ubuntu 16 04 激光雷达VLP16 ROS kinetic 使用步骤 基础设置 安装驱动 sudo apt get install ros kinetic velodyne
  • 蓝桥杯国赛C++A组B组题解整理(第八、七、六、五、四届)

    写在前面的话19 04 04 今年省赛的结果出的意外得快 有很多小伙伴来和我分享他们进了省一的喜悦 并问我啥时候更新国赛题解 emmm 不是我不想更新 实在是抽不出时间 有缘再更 虽然不更新题解 但是我决定这次提前写一点注意事项吧 省得大家
  • java 24点游戏

    24点纸牌游戏 一 内容 二 步骤 1 算法分析 2 概要设计 3 测试 4 调试 5 心得体会 一 内容 24点游戏是经典的纸牌益智游戏 常见游戏规则 从扑克中每次取出4张牌 使用加减乘除 第一个能得出24者为赢 其中 J代表11 Q代表
  • 分享一个效果很好的ddos压力测试服务网站

    分享一个经测试效果好的ddos压力测试网站 打开网站 http www akddos com 免费注册一个账户即可测试 udp流量最高400G 支持SYN CC DNS等多种模式 套餐自由选择 效果很好 大家可以去试试 网站主要是用来测试自
  • 给定一个整数数组,判断是否存在重复元素。

    存在重复元素 给定一个整数数组 判断是否存在重复元素 如果存在一值在数组中出现至少两次 函数返回 true 如果数组中每个元素都不相同 则返回 false 示例 1 输入 1 2 3 1 输出 true 作者 力扣 LeetCode 链接
  • html动态爱心代码【三】(附源码)

    目录 前言 特效 内容修改 完整代码 总结 前言 七夕马上就要到了 为了帮助大家高效表白 下面再给大家带来了实用的HTML浪漫表白代码 附源码 背景音乐 可用于520 情人节 生日 表白等场景 可直接使用 特效 内容修改 文字区 div h
  • 反卷积层(转置卷积)

    反卷积 deconvolution 不是数字信号处理里面的意义 在深度学习里面应该叫做转置卷积 transposed convolution 又名微步卷积 fractionally strided convolutions 也有叫Backw
  • Qt5开发学习总结(三)——窗口部件的使用(QWidget和QDialog)

    窗口部件 QT提供的默认基类只有QMainWindow QWidget 和QDialog这三种 这三种窗体也是用的最多的 QMainWindow是带有菜单栏和工具栏的主窗口类 QDialog是各种对话框的基类 而他们全部继承自QWidget
  • 力扣简单题合集(带答案)

    1 给定一个整数数组 nums 和一个目标值 target 请你在该数组中找出和为目标值的那 两个 整数 并返回他们的数组下标 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素不能使用两遍 class Solution publi
  • [leetcode 周赛 149] 1155 掷骰子的N种方法

    目录 1155 Number of Dice Rolls With Target Sum 掷骰子的N种方法 描述 思路 代码实现 1155 Number of Dice Rolls With Target Sum 掷骰子的N种方法 描述 这