62
62
63
63
其中 $h$ 表示第 $i$ 个骰子的点数。
64
64
65
- 最终的答案即为 $f[ n] [ target ] $。
65
+ 初始时 $f [ 0 ] [ 0 ] = 1$, 最终的答案即为 $f[ n] [ target ] $。
66
66
67
67
时间复杂度 $O(n \times k \times target)$,空间复杂度 $O(n \times target)$。
68
68
69
+ 我们注意到,状态 $f[ i] [ j ] $ 只和 $f[ i-1] [ ] $ 有关,因此我们可以使用滚动数组的方式,将空间复杂度优化到 $O(target)$。
70
+
69
71
<!-- tabs:start -->
70
72
71
73
### ** Python3**
@@ -85,6 +87,20 @@ class Solution:
85
87
return f[n][target]
86
88
```
87
89
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
+
88
104
### ** Java**
89
105
90
106
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -107,6 +123,26 @@ class Solution {
107
123
}
108
124
```
109
125
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
+
110
146
### ** C++**
111
147
112
148
``` cpp
@@ -129,6 +165,27 @@ public:
129
165
};
130
166
```
131
167
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
+
132
189
### ** Go**
133
190
134
191
``` go
@@ -157,13 +214,36 @@ func min(a, b int) int {
157
214
}
158
215
```
159
216
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
+
160
242
### ** TypeScript**
161
243
162
244
``` ts
163
245
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 ));
167
247
f [0 ][0 ] = 1 ;
168
248
const mod = 1e9 + 7 ;
169
249
for (let i = 1 ; i <= n ; ++ i ) {
@@ -177,6 +257,74 @@ function numRollsToTarget(n: number, k: number, target: number): number {
177
257
}
178
258
```
179
259
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
+
180
328
### ** ...**
181
329
182
330
```
0 commit comments