LeetCode 1155

LeetCode Contest 149 No.2

这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, …, f

我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和。

如果需要掷出的总点数为 target,请你计算出有多少种不同的组合情况(所有的组合情况总共有 f^d 种),模 10^9 + 7 后返回。

一开始我以为这是一道数学题,排列组合的数学题

因为上学的时候就是那样做的,只是有些特殊情况

然后我发现这道题的特殊情况数都数不完,我傻了

有那么一个瞬间我在想会不会是 DP ,似乎有点像

但是我不确定,随便想一下也没有想到 DP 怎么做

于是我就放弃这条思路去看 airpods 去了。。。。

竞赛结束之后我看了看别人的答案,只看了两秒钟

这不就是DP么,我关掉解答开始自己好好做这道题

开始:

class Solution:def numRollsToTarget(self, d: int, f: int, target: int) -> int:MOD = 10**9 + 7nums = [[0]*target for _ in range(d)]for i in range(min(f,target)):nums[0][i] = 1for k in range(1,d):for i in range(1,target):nums[k][i] = sum(nums[k-1][max(0,i-f):i])return nums[-1][-1]%MOD

下面以5个骰子,每个骰子6个面,要求总和为16举例:

创建一个5*16的数组,横向代表骰子的点数总和,纵向代表骰子的数量,表格内的数字代表用x个骰子拼凑出y的点数总和,共有多少种情况

首先填写第一行的数据:用一个骰子扔出总和是 1、2、3、4、5、6 的情况均只有一种,用一个骰子扔出总和是7、8、9等的情况不存在

填写第二行的数据:

用两个骰子扔出总和是1的可能情况不存在
用两个骰子扔出总和是2的可能情况只有1种,是(1,1)
用两个骰子扔出总和是3的可能情况有两种,是(1,2)和(2,1)
依次类推

我们可以这样去考虑:第二个骰子可能扔出的情况是1、2、3、4、5、6六种情况,举例如果我们要填写第二行第八个空格,即要求扔出的总和为8,那么8的可能情况数量为以前的骰子扔出的情况为7、6、5、4、3、2这六种情况的总和。即,当第二个骰子扔出1时,以前的骰子总和为7,第二个骰子扔出2时,以前的骰子总和为6,依次类推



在表格中表示即为,某一格的值为在上一行不包括当前格子向左数六个格子的总和,即下图橙色框表示的区域

以此类推填写完整个表格

在本例中,表格右下角的数字即为5个骰子扔出总和为16的可能情况数量,为735

将本例拓宽到d个骰子f个面扔出总和为target的情况数量即为题目要求

下面重新看一下程序并将整个过程梳理一遍

class Solution:def numRollsToTarget(self, d: int, f: int, target: int) -> int:MOD = 10**9 + 7nums = [[0]*target for _ in range(d)] # 初始化数组for i in range(min(f,target)):nums[0][i] = 1 # 填第一行的数for k in range(1,d):for i in range(1,target):nums[k][i] = sum(nums[k-1][max(0,i-f):i]) # 依次填写后面行的数return nums[-1][-1]%MOD #返回最终数的MOD值
  1. 建立一个二维矩阵,行数为d,列数为target,矩阵内容初始化为0
  2. 将第一行前f个数填为1
  3. 对于剩余的格子,每个格子等于上一行向前数f个数的和
  4. 返回矩阵的最后一个数

DONE

leetcode_1155 掷骰子的N种方法 动态规划相关推荐

  1. LeetCode 1155. 掷骰子的N种方法--动态规划

    掷骰子的N种方法 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target ...

  2. LeetCode-1155. 掷骰子的N种方法 ——动态规划

    这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target,请你计算出有多少 ...

  3. Leetcode1155:掷骰子的N种方法

    Leetcode1155:掷骰子的N种方法 题目: 这里有 n 个一样的骰子,每个骰子上都有 k 个面,分别标号为 1 到 k . 给定三个整数 n , k 和 target ,返回可能的方式(从总共 ...

  4. leetcode算法题--掷骰子的N种方法

    原题链接:https://leetcode-cn.com/problems/number-of-dice-rolls-with-target-sum/ 动态规划 dp[i][k]表示前i个骰子,k表示 ...

  5. LeetCode 1155. 掷骰子的N种方法(DP)

    1. 题目 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target,请你 ...

  6. leetcode - 1155. 掷骰子的N种方法

    这里有 ddd 个一样的骰子,每个骰子上都有 fff 个面,分别标号为 1,2,...,f1, 2, ..., f1,2,...,f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需 ...

  7. LeetCode 1155. 掷骰子的N种方法 每日一题

    问题描述 这里有 n 个一样的骰子,每个骰子上都有 k 个面,分别标号为 1 到 k . 给定三个整数 n ,  k 和 target ,返回可能的方式(从总共 kn 种方式中)滚动骰子的数量,使正面 ...

  8. [Swift]LeetCode1155. 掷骰子的N种方法 | Number of Dice Rolls With Target Sum

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:为敢(WeiGanTechnologies) ➤博客园地址:山青咏芝(https://www.cnblo ...

  9. Leetcode-1155 Number of Dice Rolls With Target Sum(掷骰子的N种方法)

    dp[i][j]表示前i个骰子到达数字总和j的方案数 dp[i][j] = Σdp[i-1][j-k],其中k是一个骰子能掷出的范围 1 #define _for(i,a,b) for(int i = ...

最新文章

  1. Java设计模式(学习整理)---命令模式
  2. linux cp -d复制软链接文件
  3. cp1 项目管理概述
  4. oracle 10g安装黑框消失,win7下安装和卸载oracle 10g
  5. NET 6 中新增的LINQ 方法
  6. leetcode1105. 填充书架(动态规划)
  7. linux fdisk 权限不够,Linux 文件系统结构、磁盘的管理
  8. 福布斯中国2020科技女性榜:蓝港互动廖明香、百度李莹等上榜
  9. python多进程用不了_Python多进程相关的坑
  10. Android software RD engineer能力模型
  11. 广数980td系列2级密码及相关操作
  12. audio realtek 耳机没声_解决Realtek High Definition Audio 声卡前面板耳机无声音方法
  13. 现阶段网络广告的形式并举例说明?
  14. [转]下载安装IDM Integration Module和其使用方法
  15. HSB/HSV/HSL区别
  16. 安装linux系统,卡在Detecting hardware
  17. vscode插件默认安装位置
  18. 7.动态绘制(Jig)
  19. 点击行的数据回填到模态框
  20. 【性能测试】轻商城-项目实战2

热门文章

  1. Android之给ImageView加文字
  2. [Extjs6] 组件的显示和隐藏
  3. python删除某列数据_python删除txt第一列数据库
  4. 万能遥控器 Privacy Policy
  5. 天龙八部服务器列表文件,天龙八部服务端Server目录脚本功能说明
  6. js php 批量下载文件,批量下载对路网图片并生成html的实现方法
  7. C++游戏编程教程(二)
  8. 计算机课的万能导入,以生活实例导入计算机课堂教学
  9. 人工智能之百度“神灯搜索”
  10. CCAI 2017 演讲实录 | 周登勇:众包中的统计推断与激励机制