Skip to content

Commit a1cb397

Browse files
authored
feat: add solutions to lc problem: No.1155 (#1855)
No.1155.Number of Dice Rolls With Target Sum
1 parent 1cf8661 commit a1cb397

File tree

8 files changed

+395
-60
lines changed

8 files changed

+395
-60
lines changed

solution/1100-1199/1155.Number of Dice Rolls With Target Sum/README.md

+152-4
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,12 @@ $$
6262

6363
其中 $h$ 表示第 $i$ 个骰子的点数。
6464

65-
最终的答案即为 $f[n][target]$。
65+
初始时 $f[0][0] = 1$,最终的答案即为 $f[n][target]$。
6666

6767
时间复杂度 $O(n \times k \times target)$,空间复杂度 $O(n \times target)$。
6868

69+
我们注意到,状态 $f[i][j]$ 只和 $f[i-1][]$ 有关,因此我们可以使用滚动数组的方式,将空间复杂度优化到 $O(target)$。
70+
6971
<!-- tabs:start -->
7072

7173
### **Python3**
@@ -85,6 +87,20 @@ class Solution:
8587
return f[n][target]
8688
```
8789

90+
```python
91+
class Solution:
92+
def numRollsToTarget(self, n: int, k: int, target: int) -> int:
93+
f = [1] + [0] * target
94+
mod = 10**9 + 7
95+
for i in range(1, n + 1):
96+
g = [0] * (target + 1)
97+
for j in range(1, min(i * k, target) + 1):
98+
for h in range(1, min(j, k) + 1):
99+
g[j] = (g[j] + f[j - h]) % mod
100+
f = g
101+
return f[target]
102+
```
103+
88104
### **Java**
89105

90106
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -107,6 +123,26 @@ class Solution {
107123
}
108124
```
109125

126+
```java
127+
class Solution {
128+
public int numRollsToTarget(int n, int k, int target) {
129+
final int mod = (int) 1e9 + 7;
130+
int[] f = new int[target + 1];
131+
f[0] = 1;
132+
for (int i = 1; i <= n; ++i) {
133+
int[] g = new int[target + 1];
134+
for (int j = 1; j <= Math.min(target, i * k); ++j) {
135+
for (int h = 1; h <= Math.min(j, k); ++h) {
136+
g[j] = (g[j] + f[j - h]) % mod;
137+
}
138+
}
139+
f = g;
140+
}
141+
return f[target];
142+
}
143+
}
144+
```
145+
110146
### **C++**
111147

112148
```cpp
@@ -129,6 +165,27 @@ public:
129165
};
130166
```
131167
168+
```cpp
169+
class Solution {
170+
public:
171+
int numRollsToTarget(int n, int k, int target) {
172+
const int mod = 1e9 + 7;
173+
vector<int> f(target + 1);
174+
f[0] = 1;
175+
for (int i = 1; i <= n; ++i) {
176+
vector<int> g(target + 1);
177+
for (int j = 1; j <= min(target, i * k); ++j) {
178+
for (int h = 1; h <= min(j, k); ++h) {
179+
g[j] = (g[j] + f[j - h]) % mod;
180+
}
181+
}
182+
f = move(g);
183+
}
184+
return f[target];
185+
}
186+
};
187+
```
188+
132189
### **Go**
133190

134191
```go
@@ -157,13 +214,36 @@ func min(a, b int) int {
157214
}
158215
```
159216

217+
```go
218+
func numRollsToTarget(n int, k int, target int) int {
219+
const mod int = 1e9 + 7
220+
f := make([]int, target+1)
221+
f[0] = 1
222+
for i := 1; i <= n; i++ {
223+
g := make([]int, target+1)
224+
for j := 1; j <= min(target, i*k); j++ {
225+
for h := 1; h <= min(j, k); h++ {
226+
g[j] = (g[j] + f[j-h]) % mod
227+
}
228+
}
229+
f = g
230+
}
231+
return f[target]
232+
}
233+
234+
func min(a, b int) int {
235+
if a < b {
236+
return a
237+
}
238+
return b
239+
}
240+
```
241+
160242
### **TypeScript**
161243

162244
```ts
163245
function numRollsToTarget(n: number, k: number, target: number): number {
164-
const f = Array(n + 1)
165-
.fill(0)
166-
.map(() => Array(target + 1).fill(0));
246+
const f = Array.from({ length: n + 1 }, () => Array(target + 1).fill(0));
167247
f[0][0] = 1;
168248
const mod = 1e9 + 7;
169249
for (let i = 1; i <= n; ++i) {
@@ -177,6 +257,74 @@ function numRollsToTarget(n: number, k: number, target: number): number {
177257
}
178258
```
179259

260+
```ts
261+
function numRollsToTarget(n: number, k: number, target: number): number {
262+
const f = Array(target + 1).fill(0);
263+
f[0] = 1;
264+
const mod = 1e9 + 7;
265+
for (let i = 1; i <= n; ++i) {
266+
const g = Array(target + 1).fill(0);
267+
for (let j = 1; j <= Math.min(i * k, target); ++j) {
268+
for (let h = 1; h <= Math.min(j, k); ++h) {
269+
g[j] = (g[j] + f[j - h]) % mod;
270+
}
271+
}
272+
f.splice(0, target + 1, ...g);
273+
}
274+
return f[target];
275+
}
276+
```
277+
278+
### **Rust**
279+
280+
```rust
281+
impl Solution {
282+
pub fn num_rolls_to_target(n: i32, k: i32, target: i32) -> i32 {
283+
let _mod = 1_000_000_007;
284+
let n = n as usize;
285+
let k = k as usize;
286+
let target = target as usize;
287+
let mut f = vec![vec![0; target + 1]; n + 1];
288+
f[0][0] = 1;
289+
290+
for i in 1..=n {
291+
for j in 1..=target.min(i * k) {
292+
for h in 1..=j.min(k) {
293+
f[i][j] = (f[i][j] + f[i - 1][j - h]) % _mod;
294+
}
295+
}
296+
}
297+
298+
f[n][target]
299+
}
300+
}
301+
```
302+
303+
```rust
304+
impl Solution {
305+
pub fn num_rolls_to_target(n: i32, k: i32, target: i32) -> i32 {
306+
let _mod = 1_000_000_007;
307+
let n = n as usize;
308+
let k = k as usize;
309+
let target = target as usize;
310+
let mut f = vec![0; target + 1];
311+
f[0] = 1;
312+
313+
for i in 1..=n {
314+
let mut g = vec![0; target + 1];
315+
for j in 1..=target {
316+
for h in 1..=j.min(k) {
317+
g[j] = (g[j] + f[j - h]) % _mod;
318+
}
319+
}
320+
f = g;
321+
}
322+
323+
f[target]
324+
}
325+
}
326+
```
327+
180328
### **...**
181329

182330
```

0 commit comments

Comments
 (0)