leetcode_1155 掷骰子的N种方法 动态规划
LeetCode 1155
这里有 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值
- 建立一个二维矩阵,行数为d,列数为target,矩阵内容初始化为0
- 将第一行前f个数填为1
- 对于剩余的格子,每个格子等于上一行向前数f个数的和
- 返回矩阵的最后一个数
DONE
leetcode_1155 掷骰子的N种方法 动态规划相关推荐
- LeetCode 1155. 掷骰子的N种方法--动态规划
掷骰子的N种方法 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target ...
- LeetCode-1155. 掷骰子的N种方法 ——动态规划
这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target,请你计算出有多少 ...
- Leetcode1155:掷骰子的N种方法
Leetcode1155:掷骰子的N种方法 题目: 这里有 n 个一样的骰子,每个骰子上都有 k 个面,分别标号为 1 到 k . 给定三个整数 n , k 和 target ,返回可能的方式(从总共 ...
- leetcode算法题--掷骰子的N种方法
原题链接:https://leetcode-cn.com/problems/number-of-dice-rolls-with-target-sum/ 动态规划 dp[i][k]表示前i个骰子,k表示 ...
- LeetCode 1155. 掷骰子的N种方法(DP)
1. 题目 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target,请你 ...
- leetcode - 1155. 掷骰子的N种方法
这里有 ddd 个一样的骰子,每个骰子上都有 fff 个面,分别标号为 1,2,...,f1, 2, ..., f1,2,...,f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需 ...
- LeetCode 1155. 掷骰子的N种方法 每日一题
问题描述 这里有 n 个一样的骰子,每个骰子上都有 k 个面,分别标号为 1 到 k . 给定三个整数 n , k 和 target ,返回可能的方式(从总共 kn 种方式中)滚动骰子的数量,使正面 ...
- [Swift]LeetCode1155. 掷骰子的N种方法 | Number of Dice Rolls With Target Sum
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:为敢(WeiGanTechnologies) ➤博客园地址:山青咏芝(https://www.cnblo ...
- 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 = ...
最新文章
- Java设计模式(学习整理)---命令模式
- linux cp -d复制软链接文件
- cp1 项目管理概述
- oracle 10g安装黑框消失,win7下安装和卸载oracle 10g
- NET 6 中新增的LINQ 方法
- leetcode1105. 填充书架(动态规划)
- linux fdisk 权限不够,Linux 文件系统结构、磁盘的管理
- 福布斯中国2020科技女性榜:蓝港互动廖明香、百度李莹等上榜
- python多进程用不了_Python多进程相关的坑
- Android software RD engineer能力模型
- 广数980td系列2级密码及相关操作
- audio realtek 耳机没声_解决Realtek High Definition Audio 声卡前面板耳机无声音方法
- 现阶段网络广告的形式并举例说明?
- [转]下载安装IDM Integration Module和其使用方法
- HSB/HSV/HSL区别
- 安装linux系统,卡在Detecting hardware
- vscode插件默认安装位置
- 7.动态绘制(Jig)
- 点击行的数据回填到模态框
- 【性能测试】轻商城-项目实战2
热门文章
- Android之给ImageView加文字
- [Extjs6] 组件的显示和隐藏
- python删除某列数据_python删除txt第一列数据库
- 万能遥控器 Privacy Policy
- 天龙八部服务器列表文件,天龙八部服务端Server目录脚本功能说明
- js php 批量下载文件,批量下载对路网图片并生成html的实现方法
- C++游戏编程教程(二)
- 计算机课的万能导入,以生活实例导入计算机课堂教学
- 人工智能之百度“神灯搜索”
- CCAI 2017 演讲实录 | 周登勇:众包中的统计推断与激励机制