LeetCode 1155. Number of Dice Rolls With Target Sum Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
1155. Number of Dice Rolls With Target Sum

Description

You have n dice, and each dice has k faces numbered from 1 to k.

Given three integers n, k, and target, return the number of possible ways (out of the kn total ways) to roll the dice, so the sum of the face-up numbers equals target. Since the answer may be too large, return it modulo 109 + 7.

 

Example 1:

Input: n = 1, k = 6, target = 3
Output: 1
Explanation: You throw one die with 6 faces.
There is only one way to get a sum of 3.

Example 2:

Input: n = 2, k = 6, target = 7
Output: 6
Explanation: You throw two dice, each with 6 faces.
There are 6 ways to get a sum of 7: 1+6, 2+5, 3+4, 4+3, 5+2, 6+1.

Example 3:

Input: n = 30, k = 30, target = 500
Output: 222616187
Explanation: The answer must be returned modulo 109 + 7.

 

Constraints:

  • 1 <= n, k <= 30
  • 1 <= target <= 1000

Solutions

Solution 1: Dynamic Programming

We define f[i][j] as the number of ways to get a sum of j using i dice. Then, we can obtain the following state transition equation:

f[i][j] = ∑_{h=1}min(j, k) f[i-1][j-h]

where h represents the number of points on the i-th die.

Initially, we have f[0][0] = 1, and the final answer is f[n][target].

The time complexity is O(n × k × target), and the space complexity is O(n × target).

We notice that the state f[i][j] only depends on f[i-1][], so we can use a rolling array to optimize the space complexity to O(target).

PythonJavaC++GoTypeScriptRust
class Solution: def numRollsToTarget(self, n: int, k: int, target: int) -> int: f = [[0] * (target + 1) for _ in range(n + 1)] f[0][0] = 1 mod = 10**9 + 7 for i in range(1, n + 1): for j in range(1, min(i * k, target) + 1): for h in range(1, min(j, k) + 1): f[i][j] = (f[i][j] + f[i - 1][j - h]) % mod return f[n][target](code-box)

Solution 2

PythonJavaC++GoTypeScriptRust
class Solution: def numRollsToTarget(self, n: int, k: int, target: int) -> int: f = [1] + [0] * target mod = 10**9 + 7 for i in range(1, n + 1): g = [0] * (target + 1) for j in range(1, min(i * k, target) + 1): for h in range(1, min(j, k) + 1): g[j] = (g[j] + f[j - h]) % mod f = g return f[target](code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !