1155.掷骰子等于目标和的方法数:动态规划
【LetMeFly】1155.掷骰子等于目标和的方法数:动态规划
力扣题目链接:https://leetcode.cn/problems/number-of-dice-rolls-with-target-sum/
这里有 n
个一样的骰子,每个骰子上都有 k
个面,分别标号为 1
到 k
。
给定三个整数 n
, k
和 target
,返回可能的方式(从总共 kn
种方式中)滚动骰子的数量,使正面朝上的数字之和等于 target
。
答案可能很大,你需要对 109 + 7
取模 。
示例 1:
输入:n = 1, k = 6, target = 3 输出:1 解释:你扔一个有 6 个面的骰子。 得到 3 的和只有一种方法。
示例 2:
输入:n = 2, k = 6, target = 7 输出:6 解释:你扔两个骰子,每个骰子有 6 个面。 得到 7 的和有 6 种方法:1+6 2+5 3+4 4+3 5+2 6+1。
示例 3:
输入:n = 30, k = 30, target = 500 输出:222616187 解释:返回的结果必须是对 109 + 7 取模。
提示:
1 <= n, k <= 30
1 <= target <= 1000
方法一:动态规划(DP)
开辟一个动态规划数组$dp$,其中$dp[i][j]$代表$i$个骰子的和为$j$的方案数。
初始值$dp[i][j]=0$,而$dp[1][1-k]=1$。
这样,我们就可以从第二天开始枚举:
1 |
|
优化:
- 不难发现$i$个骰子的状态只和$i-1$个骰子的状态有关,因此可以将二维数组压缩为一维。
- 我们初始化了1个骰子从1到k的方案数为1,其实我们也可以只领$dp[0][0]=1$(0个骰子和为0的方案数为1)
复杂的分析
- 时间复杂度$O(n\times k\times target)$
- 空间复杂度$O(n\times target)$或$O(target)$
AC代码
C++
没有进行空间优化:
1 |
|
Python
进行了空间优化:
1 |
|
同步发文于CSDN,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/134023955
1155.掷骰子等于目标和的方法数:动态规划
https://blog.letmefly.xyz/2023/10/24/LeetCode 1155.掷骰子等于目标和的方法数/